Nodejs版本升級導致UTF8中文字符串的md5取值前後不一致的問題

Nodejs的版本從4.x升級到8.x的過程中遇到一個問題:含有中文的UTF8字符串的md5取值在升級前後不一致。研究了一下,發現Nodejs從6.x開始對crypto做了一個改進,直接支持UTF8二進制,不用單獨再處理中文了,“buf.toString("binary")”這一句已經不需要了,加了反而會錯。

在5.x及以下版本,用下面這個函數md5中文是對的:

getMD5Chn = function(str) {
    var buf, shasum;
    buf = new Buffer(str);
    str = buf.toString("binary");
    shasum = crypto.createHash('md5');
    shasum.update(str);
    return shasum.digest('hex');
};

在6.x及以上版本,用下面這個函數md5中文是對的:

function getMD5(data) {
    var crypto = require('crypto');
    return crypto.createHash('md5').update(data).digest('hex');
}

驗證過程如下,在不同的Nodejs版本下分別調用上述兩個函數:

“中文”的正確的md5值應該是“a7bac2239fcdcb3a067903d8077c4a07”

console.log("Nodejs version: " + process.version);
console.log(getMD5Chn('中文'));
console.log(getMD5('中文'));

輸出:

[root@dev tutorial]# nvm use v4.6.0
Now using node v4.6.0 (npm v2.15.9)
[root@dev tutorial]# node md5.js
Nodejs version: v4.6.0
a7bac2239fcdcb3a067903d8077c4a07
eeff7ad1ae620adc859df95b565cd590

[root@dev tutorial]# nvm use v5.12.0
Now using node v5.12.0 (npm v3.8.6)
[root@dev tutorial]# node md5.js
Nodejs version: v5.12.0
a7bac2239fcdcb3a067903d8077c4a07
eeff7ad1ae620adc859df95b565cd590

[root@dev tutorial]# nvm use v6.17.1
Now using node v6.17.1 (npm v3.10.10)
[root@dev tutorial]# node md5.js
Nodejs version: v6.17.1
12af61c4e4ccfe790607e7f09de40c0a
a7bac2239fcdcb3a067903d8077c4a07

[root@dev tutorial]# nvm use v8.16.2
Now using node v8.16.2 (npm v6.4.1)
[root@dev tutorial]# node md5.js
Nodejs version: v8.16.2
12af61c4e4ccfe790607e7f09de40c0a
a7bac2239fcdcb3a067903d8077c4a07

[root@dev tutorial]# nvm use v12.16.0
Now using node v12.16.0 (npm v6.13.4)
[root@dev tutorial]# node md5.js
Nodejs version: v12.16.0
12af61c4e4ccfe790607e7f09de40c0a
a7bac2239fcdcb3a067903d8077c4a07
(node:19405) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章