2013-08-18 3 views
0

Я преобразовываю строки в хеши MD5 с помощью C#. Затем я преобразовываю строки в хеши MD5 с помощью Java. Я заметил, что результаты не совпадают, даже для одних и тех же входных строк.Java MD5 Hash не соответствует C# Hash

Вот мой Java код:

public String encrypt(String message) 
{ 
    String digest = null; 
    try 
    { 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     byte[] hash = md.digest(message.getBytes("UTF-8")); 
     StringBuilder sb = new StringBuilder(2*hash.length); 

     for(byte b : hash) 
     { 
      sb.append(String.format("%02x", b&0xff)); 
     } 

     digest = sb.toString(); 
    } 
    catch (Exception e) 
    { 
     //Toast.makeText(context, e.toString(), Toast.LENGTH_LONG).show(); 
    } 

    return digest; 

} 

}

Вот мой C# Код:

public static string Encrypt(string input) 
    { 
     Byte[] inputBytes = Encoding.UTF8.GetBytes(input); 

     Byte[] hashedBytes = new MD5CryptoServiceProvider().ComputeHash(inputBytes); 

     return BitConverter.ToString(hashedBytes); 
    } 

У меня есть более легкий доступ к коду Java. Можно ли каким-либо образом изменить код Java, чтобы результирующие хэши были такими же, как хэши C#?

Заранее спасибо.

+1

Я проверил бы фактические байты, выводимые обоими декодерами. Удостоверьтесь, что у вас нет спецификации ... вещи становятся странными, когда они участвуют. : P – cHao

+1

[This] (http://stackoverflow.com/questions/2920044/how-can-you-generate-the-same-md5-hashcode-in-c-sharp-and-java) должен помочь вам .. –

ответ

2

Они оба дают одинаковый результат, но выходной формат строка отличается

Java: 264fcf838c8e4b9d17c510cd5b8b9b78 
C#: 26-4F-CF-83-8C-8E-4B-9D-17-C5-10-CD-5B-8B-9B-78 

Простейшее на стороне Java, это просто переделывает свой цикл немного, чтобы добавить тир и верхний корпус гекс BitConverter.ToString() добавляет;

boolean add_dash = false; 
for(byte b : hash) 
{ 
    if(add_dash) 
     sb.append("-"); 
    add_dash = true; 
    sb.append(String.format("%02X", b&0xff)); 
} 

Это сделает и получения суммы MD5 в формате

26-4F-CF-83-8C-8E-4B-9D-17-C5-10-CD-5B-8B-9B-78 

Это проще сделать обратное на C# стороне, просто изменить свое возвращение к;

return BitConverter.ToString (hashedBytes).Replace("-", "").ToLowerInvariant(); 
0

Я считаю, что это ответ, который вы ищете:

StringBuilder hexString = new StringBuilder() 
for (byte b: hash) { 
    String hex = Integer.toHexString(b & 0xFF); 
    if (hex.length() == 1) { 
     hexString.append("0"); 
    } 
    hexString.append(hex.toUpperCase()); 
    hexString.append("-"); 
} 

hexString.toString() должен производить тот же результат, как BitConverter.ToString(byte[]) метод.