前言
金蝶EAS从7.0到8.5,用户的登录密码,用的都是同一种加密方式
如果仔细观察你会发现,不同的账号,使用相同的密码,最后生成的密文是不一样的
经过反编译标准产品的生成密码的代码,找到了生成密码的类:com.kingdee.bos.util.CryptoUtil
这个类有个静态方法public static String encrypt(String strSrc) throws CryptException来生成密码
而传入的字符串是该用户的ID连接上明文密码trim之后的字符串,返回的是加密后的密文
用用户的ID当做明文的一部分,也就导致了不同的用户,相同密码,而密文不一样,因为每个用户的ID是唯一的
目录
1.原理
其实加密的过程很简单,就是将密文进行了一次MD5加密,然后把加密后的密文进行Base64编码,只不过中间有个小细节需要注意一下。
- 将用户ID和明文密码trim连接成一个新的字符串strSrc
- 获取strSrc的字节数组btSrc
- 创建一个字节数组btKey,长度是btSrc的长度加1,然后把btSrc的数据赋值到btKey里
- 将btKey进行一次MD5加密,生成新的字节数组btDigest
- 将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();
}
}