2016-12-14 14 views
1

私はJavaにいくつかのC#を変換しています。Javaのバイト配列のハッシュ

// Return a SHA256 hash of a string, formatted in hex 
private static string HashPassword(string password) 
{ 
    SHA256Managed hash = new SHA256Managed(); 
    byte[] utf8 = UTF8Encoding.UTF8.GetBytes(password); 
    return BytesToHex(hash.ComputeHash(utf8)); 
} 

は、Javaでは、私はMessageDigestSHA256Managedを置き換え:

private static String HashPassword(String password) 
{ 
    MessageDigest hash = MessageDigest.getInstance("SHA-256"); 
    byte[] utf8 = hash.digest(password.getBytes(StandardCharsets.UTF_8)); 

    return BytesToHex(hash.ComputeHash(utf8)); // ComputeHash? 
} 

が、MessageDigestComputeHash()を持っていないも、私はそれと同等のを見ていますC#があります。 MessageDigestはここで正しいクラスですか?もしそうなら、私はComputeHash()のために何をしますか?私はどんなクラスを使用しないのですか?

BytesToHexバイト配列を16進文字列に変換します。

+2

あなたは 'MessageDigest'のJavadocを読んだことがありますか?ハッシュを終了させるメソッドは、いくつかのセグメントで計算されたハッシュの 'digest()'、または単一セグメント計算(またはマルチセグメントハッシュの最終セグメント)の 'digest(byte [])'です。 –

+0

私は読んだが、慎重ではなかった。私の間違い。 –

答えて

4

MessageDigestはステートフルです。インクリメンタルにデータを渡し、完了したらすべてのデータのハッシュを計算するためにdigest()に電話してください。

hash.digest(byte[])メソッドは、基本的にhash.update(byte[])の略語です。hash.digest()です。

digest()を呼び出すと、MessageDigestインスタンスも初期状態にリセットされます。

3

Javaでは、変数utf8にはC#とは異なり、計算されたハッシュが含まれています。

byte[] utf8 = password.getBytes(StandardCharsets.UTF_8); 

return bytesToHex(hash.digest(utf8)); 

サイドノート:C#はそれがあるべき見え方を一致させるにはlowerCamelCasedメソッド名に対するJavaのコーディング標準を尊重してください。