2012-12-09 57 views
1

我使用Apache DS與Spring LDAP進行身份驗證和用戶管理。 Apache DS將密碼字段作爲散列字節數組發送,所以我需要將其解密爲字符串。我正在使用MD5哈希。無法解密MD5哈希字節數組

例如,下面是用於使用Apache DS工作室輸入密碼的窗口:

(出於演示的目的,我想告訴輸入的密碼是)

enter image description here

Apache DS將密碼字段作爲散列字節數組發送。當我嘗試使用如下的Spring LDAP時,我得到了[B @ 66ca6254。我需要解密它,並得到它的十六進制值,它是c4ca4238a0b923820dcc509a6f75849b,如上所示。

回答

3

你來到這裏兩個問題:

  • 您使用的術語「解密」,如果你是真正能夠恢復原來的密碼。事實並非如此。希望您已經理解了這一點,並且您只是不恰當地使用術語「解密」
  • 您在字節數組上調用toString()。這就是「B @ 66ca6254」這個值,它表明你調用它的對象是一個字節數組,然後是一個散列。你真正感興趣的是字節數組的十六進制表示。

基本上你只需要將字節數組轉換爲十六進制字符串。有多種方式可以做到這一點 - 無論是在您自己的代碼中,還是使用第三方庫(如Apache Commons Code及其Hex類)。如果您不想包含額外的庫,則在堆棧溢出時會有加載的代碼片段用於字節數組到十六進制字符串的轉換,例如here。 (也有javax.xml.bind.DataTypeConverter,但我個人不希望將其用於常規轉換 - 它對我來說太過於類似於XML的類型,我敢說它可以正常工作,它只是給代碼中的錯誤印象。)

編輯:現在,你已經告訴我們你得到的字節,你不要只是想使用十六進制。您已獲得"{MD5}xMpCOKC5I4INzFCab3WEmw=="的ASCII編碼格式,它本身表明它是MD5,然後是base64編碼版本。因此,你應該:

  • 字節數組轉換爲使用new String(data, "ASCII")
  • 檢查字符串以"{MD5}"
  • 解碼字符串爲base64的其餘開頭的字符串(即,剝離前5個字符,然後通過base64解碼運行其餘部分)。同樣,您可以使用Apache Commons Codec,或者使用this public domain base64 decoder(或許多其他解決方案)。
  • 在這一點上,你有實際散列的原始二進制數據。如前所述,如果需要,可以將其轉換爲十六進制。
+0

'字符串十六進制串=新的String(Hex.encodeHex(byteArrayPassword));'這給了我** ** 7b4d44357d784d70434f4b43354934494e7a464361623357456d773d3d而不是** ** c4ca4238a0b923820dcc509a6f75849b。 – talha06

+1

@ talha06:啊,對。現在我明白了。將編輯。 –

+0

現在它提供了這些輸出,我仍然無法將原始密碼的十六進制值轉換回來'hexString = hexString.substring(5); // xMpCOKC5I4INzFCab3WEmw == byte [] bytes = Base64.decodeBase64(hexString.getBytes()); hexString = Hex.encodeHex(bytes).toString(); // [C @ 4c065f0a' – talha06

0

你不能解密MD5哈希,它是單向哈希函數。

+0

不,我的意思只是轉換散列字節數組轉換爲十六進制 – talha06