2016-03-29 6 views
3

ここでは、塩漬けのパスワードをハッシュし、最初のバイトをコンソールに出力するJavaコードを示します。印刷された値は、誰かが私には違いを見つける助けてくださいもらえますか?私は上記と同じだと思った次のC#コードは、40Javaでコード化されたSHA1は、同じC#コードと異なる結果をもたらします。

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; 
    } 
} 

価値を生み出す62

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; 
    } 
} 

ですか

答えて

1

Java版では、パスワードに続いてsaltがあります。 C#版では、これは逆です。

+0

ありがとう、あなたはそれを釘付けにした。 – Barry

3

Javaの主な違いの1つは、bytesignedであり、C#ではbyteunsignedです。 C#のJava byteに相当するのは、byteではなくsbyteです。

C#でJavaと同じ結果を得たい場合は、Javaで使用するbyteごとにsbyteを使用してください。

+1

IIUC、sbyte vs byteは、ハッシュアルゴリズムに関しては何の違いもありません。コンソール出力だけです。この場合、コンソール出力も同じであったはずです。 – Barry

関連する問題