【末世旅行之金蝶EAS】用明文生成加密后的用户登录密文的原理和代码

前言

金蝶EAS从7.0到8.5,用户的登录密码,用的都是同一种加密方式

如果仔细观察你会发现,不同的账号,使用相同的密码,最后生成的密文是不一样的

经过反编译标准产品的生成密码的代码,找到了生成密码的类:com.kingdee.bos.util.CryptoUtil

这个类有个静态方法public static String encrypt(String strSrc) throws CryptException来生成密码

而传入的字符串是该用户的ID连接上明文密码trim之后的字符串,返回的是加密后的密文

用用户的ID当做明文的一部分,也就导致了不同的用户,相同密码,而密文不一样,因为每个用户的ID是唯一的


目录

1.原理

2.代码


1.原理

其实加密的过程很简单,就是将密文进行了一次MD5加密,然后把加密后的密文进行Base64编码,只不过中间有个小细节需要注意一下。

  1. 将用户ID和明文密码trim连接成一个新的字符串strSrc
  2. 获取strSrc的字节数组btSrc
  3. 创建一个字节数组btKey,长度是btSrc的长度加1,然后把btSrc的数据赋值到btKey里
  4. 将btKey进行一次MD5加密,生成新的字节数组btDigest
  5. 将btDigest进行Base64编码

值得注意的是,他并没有用字符串strAll直接去进行MD5加密,而是将它增加了一个字节之后再去加密,这样最后面就多了一个字节0,是非常好的一个想法。这样做的好处就是,并没有采用市面上大多数的加salt或者多次MD5加密的方式,也就没有办法通过查MD5原文的网站来破解了,所以以我目前的认知,如果想破解,只能用这段代码自己穷举密码字典来暴力破解了。只要密码设置的长一点,复杂一点,是很难破解出的。

2.代码

这里只贴上关键的代码,具体的可运行的项目可以到这里下载:CSDN下载

public static void main(String[] args) {
	String strSrc = "00000000-0000-0000-0000-00000000000013B7DE7F" + "abcde";//明文是abcde
	byte[] btKey = new byte[strSrc.getBytes().length + 1];//注意这里的长度加1
	System.arraycopy(strSrc.getBytes(), 0, btKey, 0, strSrc.getBytes().length);
	String strEncode = "";
	try {
		MessageDigest md = MessageDigest.getInstance("MD5");
		md.update(btKey);
		byte[] btDigest = md.digest();

		strEncode = Base64Encoder.byteArrayToBase64(btDigest);
		System.out.println(strEncode);
	} catch (Exception e) {
		e.printStackTrace();
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值