2016-03-29 9 views
3

Вот некоторый код Java, который хэширует соленый пароль и печатает первый байт на консоли. Печататься значение 62.SHA1, закодированный в Java, дает разные результаты от идентичного кода C#

import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 

class AuthTest 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     byte[] result; 
     byte[] salt = new byte[] { (byte)0xe3, (byte)0x2c, (byte)0xf8, (byte)0x9e, (byte)0x6f, (byte)0xe4, (byte)0xf8, (byte)0x90 }; 
     byte[] password = "password".getBytes("UTF-8"); 

     result = getHash(1105, password, salt); 
     System.out.println(result[0]); 
    } 

    public static byte[] getHash(int iterations, byte[] password, byte[] salt) throws NoSuchAlgorithmException, 
     UnsupportedEncodingException { 
     MessageDigest md = MessageDigest.getInstance("SHA-1"); 
     md.reset(); 
     md.update(salt); 
     byte[] result = md.digest(password); 
     for (int i = 0; i < iterations; i++) { 
      md.reset(); 
      result = md.digest(result); 
     } 
     return result; 
    } 
} 

Следующая C# код, который я думал, был идентичен описанному выше, дает значение 40.

void Main() 
{ 
    byte[] salt = new byte[] { (byte)0xe3, (byte)0x2c, (byte)0xf8, (byte)0x9e, (byte)0x6f, (byte)0xe4, (byte)0xf8, (byte)0x90 }; 
    byte[] password = Encoding.UTF8.GetBytes("password"); 

    var result = GetHash(1105, password, salt); 
    Console.WriteLine(result[0]); 
} 

public byte[] GetHash(int iterations, byte[] password, byte[] salt) 
{ 
    var saltedPassword = password.Concat(salt).ToArray(); 
    using (var sha1 = new SHA1CryptoServiceProvider()) 
    { 
     var result = sha1.ComputeHash(saltedPassword); 

     for (int i = 0; i < iterations; ++i) 
     { 
      result = sha1.ComputeHash(result); 
     } 
     return result; 
    } 
} 

Может кто-то пожалуйста, помогите мне определить разницу?

ответ

1

В версии Java у вас есть соль, за которой следует пароль. В версии C# это наоборот.

+0

Спасибо, ты прибил его. – Barry

3

Одним из основного отличия является то, что в Java, byte является signed в то время как в C#, byte является unsigned. Эквивалент для Java byte в C# равен sbyte, а не byte.

Если вы хотите получить тот же результат, что и Java в C#, используйте sbyte за каждые byte, которые вы используете в Java.

+1

IIUC, sbyte vs byte не должен иметь никакого отношения к алгоритму хеширования, просто выход в консоль. В этом случае даже консольный вывод должен быть одинаковым. – Barry

 Смежные вопросы

  • Нет связанных вопросов^_^