2011-06-23 39 views
3

我有一個示例應用程序,它在PHP中生成SHA1哈希如下。Java的等效PHP的包功能

base64_encode(pack('H*', sha1($pass))); 

我試圖在Java中實現相同,但到目前爲止,輸出是不同的。我使用的方法如下(Base64和Hex類來自commons-codec庫)。

byte[] rawSHA = null; 
    byte[] base64HexSHA = null; 
    String hex = null; 
    MessageDigest md= null; 

    // Get Message Digest Instance. 
    try { 
     md = MessageDigest.getInstance(SHA1_ALGORITHM); 
    } catch (NoSuchAlgorithmException e) { 
     LOG.error("Unable to load SHA-1 Message Digest : " + e.getMessage(), e); 
     throw new IllegalStateException("SHA-1 Message Digest Instance Not Found"); 
    } 

    // Build SHA1 Hash 
    rawSHA = md.digest(rawText.getBytes("UTF-8")); 

    // Convert to HEX 
    hex = new String(Hex.encodeHex(rawSHA)); 

    // Encode to Base 64 
    base64HexSHA = Base64.encodeBase64(hex.getBytes("UTF-8")); 

    // Return String 
    return new String(base64HexSHA); 

我的問題是,我採取的方法會產生與PHP的pack()函數相同的輸出嗎?我的猜測是PHP pack()函數返回原始字節,因爲Hex.encodeHex返回十六進制字符串形式(ref:http://www.w3schools.com/php/func_misc_pack.asp)。

如何在Java中實現與PHP的pack()函數(或上述PHP代碼的完整輸出)相同的輸出?

回答

3

皈依到HEX不是必需的,只是使用:

base64HexSHA = Base64.encodeBase64(rawSHA); 
+0

非常感謝。我的錯。在完成包功能描述之後,我決定對其執行HEX操作。最初它沒有十六進制部分,但沒有給我輸出。剛纔我發現這是因爲另一個問題(我傳入的源字符串不是我期望的格式,有一個錯字)。非常感謝。 –

+2

這不是問題的答案。 這是很好,你注意到包是不需要的,BU不回答其他人會來這裏的實際問題。 你的回答應該是之後的推薦。 – frostymarvelous