前言
金蝶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();
}
}