web-dev-qa-db-ja.com

crypto.createHashが新しいバージョンで異なる出力を返すのはなぜですか?

問題

crypto.createHashを使用してmd5ハッシュを生成するnode.jsモジュールがあります。

最近、cryptoモジュールによって生成されたハッシュが新しいバージョンで異なることに気づきました。

コード

require('crypto').createHash('md5').update('¥').digest('hex')

Node.js v0.10.0

出力:ab3af8566ddd20d7efc9b314abe90755

Node.js v6.1.0

出力:07625e142e4ac5961de57472657a88c1

質問

新しいバージョンでそれを引き起こす原因と、これを解決するにはどうすればよいのでしょうか。

更新

GitHubでの同様の問題:

13
gevorg

Node v6 +の一部の入力は、以前のNodeバージョンとは異なるハッシュを計算します。

基本的に、文字列を.update()に渡すと、Node v6より前のバージョンではデフォルトのエンコーディングはbinaryでしたが、Node _utf-8_に変更されたv6。

たとえば、次のコードを考えてみましょう。

_require('crypto').createHash('md5').update('¥').digest('hex')
_

これにより、_ab3af8566ddd20d7efc9b314abe90755_ on Node pre-6および_07625e142e4ac5961de57472657a88c1_ on Node 6。

Node 6で6より前のバージョンと同じように出力する場合は、.update()binaryエンコーディングを使用するように指示する必要があります。

_require('crypto').createHash('md5').update('¥', 'binary').digest('hex')
_

またはその逆(Node pre-6出力を6と同じにする):

_require('crypto').createHash('md5').update('¥', 'utf-8').digest('hex')
_
25
robertklep

Githubでこの問題をマークするのと同じように: https://github.com/nodejs/node/issues/681 は、v5/v6でutf8に変更されたダイジェストのデフォルトのエンコーディングに関するものですv4以前では、それはbinaryでした。

4
ccmorataya