2017-09-05 49 views
0

我的目標是取一個字符串(本例中爲密碼)找到它的MD5 Hash,並將其轉換爲base64。這是我嘗試自動登錄到瀏覽器的加密的第一部分。當我測試密碼「測試」時,它通過罰款。但是,嘗試「asdf」時,我得到不同的哈希值。我知道這是base64轉換部分的問題,因爲MD5散列總是正確的。您可以通過尋找「ASDF」(912ec803b2ce49e4a541068d495ab570)的MD5哈希看到「正確」的輸出並粘貼到這一點的HEX箱here.Base 64轉換導致Java Base64庫的結果不正確

的鏈接下面的代碼以「測試」帶口令https://ideone.com/SmaNsR
鏈接下面用「ASDF」的代碼受密碼/ OOSrmV(只能張貼2個鏈接)

class myClass { 

    public static void main(String[] args) { 
     String password = "asdf"; 
     try { 
      System.out.println(password); 
      password = (passwordencrypt(password)); 
      System.out.println(password); 

     } catch (NoSuchAlgorithmException ex) { 
      System.out.println("oops"); 
     } 
     password = base16to64(password); 

     System.out.println(password); 

    } 

    public static String passwordencrypt(String password) throws NoSuchAlgorithmException { 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     md.update(password.getBytes()); 
     byte[] b = md.digest(); 
     StringBuffer sb = new StringBuffer(); 
     for (byte b1 : b) { 
      sb.append(Integer.toHexString(b1 & 0xff).toString()); 
     } 
     return sb.toString(); 
    } 
    public static String base16to64(String hex){ 
    return Base64.getEncoder().encodeToString(new BigInteger(hex, 16).toByteArray()); 
    } 

} 

編輯:每jrtapsell的推薦,樣品輸入和輸出。

輸入: 「測試」
我的程序:CY9rzUYh03PK3k6DJie09g ==
它應該是什麼:CY9rzUYh03PK3k6DJie09g ==

輸入: 「ASDF」 我的程序:AJEuyDss5J5KVBaNSVq1cA == 它應該是什麼:kS7IA7LOSeSlQQaNSVq1cA ==

+0

您可以添加預期的輸入和輸出到問題,所以他們可以更容易地比較 – jrtapsell

+3

爲什麼十六進制編碼,然後base64編碼? –

+0

@ElliottFrisch MD5已經是base64編碼了,所以我想解碼它,並用base64編碼。如果你問爲什麼這整個過程,這是因爲我正在嘗試構建一個可以自動登錄到[本網站](https://pschool.aaps.k12.mi.us/public/)的應用程序,而且是該網站傳輸證書的方式。 我試圖做的過程hex_md5> base64_md5 –

回答

2

不要轉換爲十六進制然後解碼十六進制和編碼爲base64,簡化您的代碼 - 直接編碼爲base64。喜歡的東西,

public static String passwordencrypt(String password) 
     throws NoSuchAlgorithmException { 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    md.update(password.getBytes()); 
    byte[] b = md.digest(); 
    return base64(b); 
} 

public static String base64(byte[] bytes) { 
    return Base64.getEncoder().encodeToString(bytes); 
} 

,然後取下調用base16to64main和我

kS7IA7LOSeSlQQaNSVq1cA== 

其中關於相關聯的網站以base64字符串相匹配。

+0

哇。這簡單得多。標記爲已解決。 另外,你不會知道爲什麼會發生這種情況,對吧?現在並不重要,我有一個更簡單的方法來做到這一點,但我仍然好奇。 –

+0

@SampathEaty您的十六進制編碼器關閉,或者您的十六進制解碼器關閉。但你並不需要任何一個,所以我不會再花更多時間。 –

+0

@SampathEaty可能是以下組合:1.'password.getBytes()'依賴於系統的默認字符集,這在所有操作系統中都不相同。 2. Integer.toHexString返回字節值爲0-15的長度爲1的字符串。 3.'BigInteger.toByteArray'忽略前導零字節;例如,'new BigInteger(「000」,16).toByteArray()'將返回兩個字節,而不是四個。 – VGR