2017-02-13 113 views
-4
private String getString(byte[] bytes) 
    { 
    StringBuffer sb = new StringBuffer(); 
    for (int i = 0; i < bytes.length; i++) 
    { 
     byte b = bytes[i]; 
     sb.append(0xFF & b); 
    } 
    return sb.toString(); 
    } 

    public String encrypt(String source) 
    { 
    try 
    { 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     byte[] bytes = md.digest(source.getBytes()); 
     return getString(bytes); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); } 
    return null; 
    } 

如果我的文字=「測試」 第一部分的toString())生產的「加密$ -2 @ 6966b26b」 的值,而第二部分則獲取和產生的「91431072057033211115202222781313839180246」 值,但爲什麼md5的數字而不是31f521a06d5060d1f38159c74a1f7cf2或類似的東西?這是什麼樣的散列/加密?

+5

它字面意思是MD5代碼... –

+0

的數字呈現,是因爲你得到的字節數回。如果你想以十六進制表示,像31f521a06d5060d1f38159c74a1f7cf2你需要將你的字節轉換爲16基地。所以介於00-ff之間的值。 –

回答

0

它在代碼中明確提出昱歐使用MD5哈希算法

現在你的問題是,爲什麼:

但是爲什麼md5的數字而不是31f521a06d5060d1f38159c74a1f7cf2或類似的東西?

你的回答很簡單,看看你的字節數組產生你的字符串的代碼。

byte b = bytes[i]; 
    sb.append(0xFF & b); 

你把字節,即0x20的,那麼你進行邏輯和操作整數0x255然後添加導致喲你的StringBuilder的十進制表示。 你想要做的更像是

sb.append(Integer.toHexString(0xff&b)); 
+0

任何方式將原始轉換爲HexString? – NoHacksJustCoCo

0

我要說的MD5哈希值,因爲代碼說MessageDigest.getInstance("MD5"):d

+0

但爲什麼是md5的數字而不是31f521a06d5060d1f38159c74a1f7cf2或類似的東西? – NoHacksJustCoCo

1

功能 「加密()」 返回一個MD5哈希值。您應該將其重命名爲「散列」,因爲散列!=加密。 如果要加密的字符串,你可以看看這裏:https://gist.github.com/bricef/2436364

+0

但爲什麼是md5的數字而不是31f521a06d5060d1f38159c74a1f7cf2或類似的東西? – NoHacksJustCoCo

+0

我發現這個:[MD5摘要](http://www.stackoverflow.com/questions/5470219/get-md5-string-from-message-digest) –