簡體   English   中英

Android上的MD5奇怪行為

[英]MD5 Bizarre Behavior on Android

我有一個簡單的方法,它在一個字符串,用MD5算法散列它(不用說,所有這些sysos是監控/調試我已經經歷了奇怪的行為):

private String hashMD5(String input) throws UnsupportedEncodingException, NoSuchAlgorithmException {
    MessageDigest digest = MessageDigest.getInstance("MD5");

    // BYTES_ENCODING == "UTF-8"
    digest.update(input.getBytes(BYTES_ENCODING), 0, input.length());

    System.out.println(new BigInteger(1, digest.digest()).toString(16));
    System.out.println(new BigInteger(1, digest.digest()).toString(16));
    System.out.println(new BigInteger(1, digest.digest()).toString(16));

    String hash = new BigInteger(1, digest.digest()).toString(16);
    System.out.println(hash + " : used hash");
    System.out.println(hash.length() + " - " + new BigInteger(1, digest.digest()).toString(16).length());
    return hash;
}

使用set String調用此方法時,這是我得到的:

02-18 08:49:23.355: I/System.out(2753): 78bfa0ce6d53a698a98aac899562bb4
02-18 08:49:23.355: I/System.out(2753): d41d8cd98f00b204e9800998ecf8427e
02-18 08:49:23.355: I/System.out(2753): d41d8cd98f00b204e9800998ecf8427e
02-18 08:49:23.355: I/System.out(2753): d41d8cd98f00b204e9800998ecf8427e : used hash
02-18 08:49:23.355: I/System.out(2753): 32 - 32

所以我對你們的問題是:

為什么第一個BigInteger與其他所有BigInteger (長度和內容)有什么不同?

我在我的兩個測試設備上都遇到了同樣的行為,我必須創建至少2個BigInteger以獲得正確長度的哈希值:

  1. Nexus S(Android 4.1.1)
  2. Nexus 7(Android 4.2.2)

因為第一個digest.update()更新摘要但不重置MessageDigest instence。 然后打印的第一個結果是input.getBytes(BYTES_ENCODING),0,input.length())與新BigInteger(1,digest.digest())連接的散列.toString(16)

評論讀取digest.update(...)的行

請注意,BigInteger.toString()僅將字節數組轉換為十六進制。 它不附加任何前導零。

String s = new BigInteger(1, digest.digest()).toString(16);
while (s.length()<16) s="0"+s; //or something else to the same effect
System.out.println(s);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM