2012-02-28 26 views
0

我試圖用java獲得一個MD5,並且我收到一個負值。 MD5可以產生負值嗎?在md5上產生一個負值

這是我的代碼:

 MessageDigest md5 = MessageDigest.getInstance("MD5"); 
     byte[] sigBytes = md5.digest((sharedSecret+"api_key"+API_KEY).getBytes()); 
     api_sig = new BigInteger(sigBytes).toString(16); 

謝謝。

+0

@Vache - 這是Java,而不是C#。 – MByD 2012-02-28 11:27:13

+0

哇,對不起,我剛剛醒來時不應該投票結束。 – Vache 2012-02-28 11:28:03

回答

2

new BigInteger(sigBytes)正在將您的簽名解釋爲帶符號的整數,所以是的,可能會得到一個負數。如果你想讓你的字符串包含你的md5值的十六進制表示,看看這裏的一些答案:How can I generate an MD5 hash?

+0

'toString(16)'是獲取十六進制表示的不好方法嗎? – SnapDragon 2012-02-28 16:41:20

0

我使用下面的方法來獲得正確的MD5哈希字符串(它永遠不會給我「負」值):

public static String createMD5Hash(String input) { 
    try { 
     MessageDigest m = MessageDigest.getInstance("MD5"); 
     byte[] out = m.digest(input.getBytes()); 
     return new String(Base64.encodeBase64(out)); 
    } catch (NoSuchAlgorithmException e) { 
     return null; 
    } 
} 

注意,Base64是從Apache的百科全書類:

import org.apache.commons.codec.binary.Base64; 
0

作爲jbowes提到的,new BigInteger(sigBytes)被解釋簽名作爲一個符號整數(意味着第一比特表示是否數是正面還是負面)。如果您希望它將字節解釋爲無符號數字,則應該使用new BigInteger(1, sigBytes)