2017-05-16 13 views
2

私はMessageDigest.digest()メソッドを呼び出してパスワードのハッシュを取得しています。 パスワードにノルウェー語の文字が含まれている場合。 'ø'の場合、このメソッドは最後の文字が異なる別の文字列に対して同じハッシュを返します。 "Høstname1""Høstname2"のハッシュ値は同じですが、"Hostnøme1"のハッシュ値は'ø'と異なる場合があります。これは "utf-8"エンコーディングです。 "iso-8859-1"エンコーディングの場合、この問題は表示されません。これは既知の問題ですか、私はここで何かを逃していますか?ノルウェー文字を持つ異なる文字列に対して同じハッシュを返すMessageDigest.digest()

これは私のコードです:

import java.security.MessageDigest; 

    String password = "Høstname1"; 
    String salt = "6"; 

    MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); 
    byte[] hash = new byte[40]; 
    messageDigest.update(salt.getBytes("utf-8"), 0, salt.length()); 
    messageDigest.update(password.getBytes("utf-8"), 0, password.length()); 
    hash = messageDigest.digest(); 
+0

ちょっと推測しますが、ソースファイルのエンコーディングとコンパイラのエンコーディングセットとは何か関係があります。 –

答えて

0

あなたはmessageDigest.update

messageDigest.update(password.getBytes("utf-8"), 0, password.length()); 

が、UTF-8エンコードされた以来、バイト配列の長さに文字列の長さを渡すべきではありません文字列内の文字数より多くのバイト数が文字列内の文字数より多い:

byte[] pwd = password.getBytes("utf-8"); 
messageDigest.update(pwd, 0, pwd.length); 

またはより短い(感謝@Matt)saltため

messageDigest.update(password.getBytes("utf-8")); 

同じ。

したがって、コードではパスワードの先頭がハッシュされていました。

+0

ありがとう、それは今働いています。 なぜ私はすべての英語の文字で以前に働いていたのだろうと思っています。 – namang029

+0

@ namang029パスワードのすべての文字が<128であれば 'password.getBytes(" utf-8 ")。length == password.length()'バグに気付かなかったので – wero

+0

@ namang029あなたがこのミスをしているかどうか心配する必要はありません –

関連する問題