2016-09-21 12 views
0

これをチェックしてください:同じバイナリが異なるmd5を生成する

文字列をバイナリとしてエンコードしてmd5を出力します。私は2つのコードベースを持っています:ノードとPHP。

PHP:

<?php 
$key="12ab"; 
$hex_key = pack('H*', $key); 
for ($i=0; $i<strlen($hex_key); $i++) { 
    echo ord(substr($hex_key, $i ,1))."\n"; 
}  
echo md5($hex_key)."\n"; 

この出力を生成します

/code # php md5.php 
18 
171 
53e035069bdb4f08a666fb7d42f29b15 

ノード:

​​

この出力を生成します

/code # node md5.js 
18 
171 
3f83d1a9a01e19e1a85665394f0f5a09 

バイナリに同じコードがあり、同じ順序であることがわかります。 同じmd5を持っていないのはどうでしょうか?

+0

http://stackoverflow.com/questions/3450983/will-the-md5-cryptographic-hash-function-output-be-same-in-all-programming -langu – RST

+0

2つの可能性のうちの1つがあります。1.実装の1つでMD5が壊れています。 2.同じ入力を提供していません。私は#2に賭けて、デバッグし、値が期待されるフォーマットで供給され、出力が正しく表示されていることを保証します。 – zaph

答えて

1

文字列は、文字列内のバイナリデータを格納しないでくださいMD5

const crypto = require("crypto"); 
const key = "12ab"; 

let hex_key = ""; 

for (let i = 0; i < key.length; i += 2) { 
    hex_key += String.fromCharCode(parseInt(key[i] + key[i+1], 16)); 
} 
var str = "" 
console.log('length ' + hex_key.length); 
for (var i = 0; i < hex_key.length; i++) { 
    console.log(hex_key.charCodeAt(i)); 
} 
console.log(crypto.createHash('md5').update(new Buffer(hex_key, "binary")).digest("hex")); 
2

に送信する前に、バイナリバッファに切り替えるべきです。それはほとんど動作しません。このようBufferとして適当な容器を使用します。

const crypto = require("crypto"); 
const key = "12ab"; 

console.log(crypto.createHash('md5').update(new Buffer(key, "hex")).digest("hex")); 
関連する問題