【末世旅行之金蝶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();
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章