简体   繁体   English

同一二进制文件产生不同的md5

[英]Same binary produces different md5

Check this out: 看一下这个:

I want to encode a string as binary and print it's md5. 我想将字符串编码为二进制并将其打印为md5。 I have 2 code bases: node and php. 我有2个代码库:node和php。

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";

Produces this output: 产生以下输出:

/code # php md5.php 
18
171
53e035069bdb4f08a666fb7d42f29b15

Node: 节点:

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) );
}
for (var i = 0; i < hex_key.length; i++) {
    console.log(hex_key.charCodeAt(i));        
}
console.log( crypto.createHash('md5').update( hex_key).digest("hex");

Produces this output: 产生以下输出:

/code # node md5.js
18
171
3f83d1a9a01e19e1a85665394f0f5a09

You can see the binary has the same code, and is in the same order. 您可以看到二进制文件具有相同的代码,并且具有相同的顺序。 How is it possible to not have the same md5? 怎么可能没有相同的md5?

Don't store binary data in a string. 不要将二进制数据存储在字符串中。 It rarely works. 它很少起作用。 Use the appropriate containers such as a Buffer : 使用适当的容器,例如Buffer

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

console.log(crypto.createHash('md5').update(new Buffer(key, "hex")).digest("hex"));

The string should be switched to binary buffer before sending it to md5 在将字符串发送到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"));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM