2016-06-30 4 views
2

ノードと.NETで同じパスワード/塩の組み合わせをハッシュしようとすると、異なる値になります。 (はい、私はSHA1が危険であることを知っています、私もそれを変更しようとしています)。.NETとnodejs(crypto)を比較するとハッシュ値が異なる

C#の

byte[] unencodedBytes = Encoding.Unicode.GetBytes(password); 
byte[] saltBytes = Convert.FromBase64String(salt); 

byte[] buffer = new byte[unencodedBytes.Length + saltBytes.Length]; 

Buffer.BlockCopy(unencodedBytes, 0, buffer, 0, unencodedBytes.Length); 
Buffer.BlockCopy(saltBytes, 0, buffer, unencodedBytes.Length - 1, saltBytes.Length); 

byte[] hash = HashAlgorithm.Create("SHA1").ComputeHash(buffer); 

//This is what I need 
string hashedString = Convert.ToBase64String(hash); 

は、ここに私のJS

var buffer = []; 
var unicodePassword = new Buffer(password, 'utf16le'); 
for (var i = 0; i < unicodePassword.length; ++i) { 
    buffer.push(unicodePassword[i]); 
} 
var salt = new Buffer(userEntry.PasswordSalt, 'base64'); 
for (var i = 0; i < salt.length; i++) { 
     buffer.push(salt[i]); 
} 
var bufferString = new Buffer(buffer); 

//This is what I need 
var hashedString = crypto.createHash('sha1').update(bufferString).digest('base64'); 

私はハッシュ化されるようにそれを送信するとき、私は両方の実装にまったく同じバイト配列を取得していますことを知っているのです。このコードはまったく同じことをしているようですが、hashedStringの値は同じではありません。何が起きているのか?

+1

彼らはまったく同じです作るためにあなたの 'unencodedBytes'と' unicodePassword'のバイト配列を確認してください。 C#でUnicodeを使って 'String'をエンコーディングしているようですが、JavaScript実装では' UTF16LE'を使用しています。これにより問題が発生する可能性があります。 –

+0

あなたは正しいです。 'unicodePassword'の後に余分な0があり、塩の後ろに欠けていましたが、残りのデータは同じなので、簡単にそれを逃しました。代わりにどのようなエンコーディングを使用しますか?私はちょうど手動で0を追加/削除することができたと思います。 – jugg1es

+0

可能であれば、UTF-8を両端で使用することをお勧めします。ベースを十分にカバーする必要があります。パスワード認証にこれを使用していると仮定します。 –

答えて

-1

デフォルトのEncoding.Unicodeが発光しています。バイトオーダーマスク C#コードでBOMのないエンコーディングを作成するとどうなりますか?

new UnicodeEncoding(false, false)

関連する問題