node.js哈希字符串?

哈希 Node.js

米亚凯

2020-03-18

我有一个要哈希的字符串。在node.js中生成哈希的最简单方法是什么?

哈希用于版本控制,而非安全性。

第2132篇《node.js哈希字符串?》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

2个回答
乐米亚 2020.03.18

在这里,您可以在您的硬件上对所有受支持的哈希进行基准测试,并由您的node.js版本支持。有些是加密的,有些仅用于校验和。它为每种算法计算“ Hello World”一百万次。每种算法可能需要1-15秒左右的时间(在带有Node.js 4.2.2的标准Google计算引擎上测试)。

for(var i1=0;i1<crypto.getHashes().length;i1++){
  var Algh=crypto.getHashes()[i1];
  console.time(Algh);
  for(var i2=0;i2<1000000;i2++){
    crypto.createHash(Algh).update("Hello World").digest("hex");
  }
  console.timeEnd(Algh);  
}

结果:
DSA:1992ms
DSA-SHA:1960ms
DSA-SHA1:2062ms
DSA-SHA1-old:2124ms
RSA-MD4:1893ms
RSA-MD5:1982ms
RSA-MDC2:2797ms
RSA-RIPEMD160:2101ms
RSA-SHA:1948ms
RSA-SHA1 :1908ms
RSA-SHA1-2:2042ms
RSA-SHA224:2176ms
RSA-SHA256:2158ms
RSA-SHA384:2290ms
RSA-SHA512:2357ms
dsaEncryption:1936ms
dsaWithSHA:1910ms
dsaWithSHA1:1926ms
DSS1:1928ms
ECDSA-与-SHA1:1880ms
MD4: 1833ms
md4WithRSA 加密:1925ms
md5:1863ms md5WithRSA
加密:1923ms
mdc2:2729ms
mdc2WithRSA:2890ms
RIPEMD:2101ms
RIPEMD160:2153ms
ripemd160WithRSA:2210ms
rmd160:2146ms
SHA:1929ms
SHA1:1880ms
sha1WithRSAEncryption:1957ms
SHA224:2121ms
sha224WithRSAEncryption:2290ms
SHA256:2134ms
sha256WithRSAEncryption:2190ms
SHA3​​84:2181ms
sha384WithRSAEncryption:2343ms
SHA512:2371ms
sha512WithRSAEncryption:2434ms
shaWithRSAEncryption:1966ms
ssl2- md5:1853ms
ssl3-md5:1868ms
ssl3-sha1:1971ms
漩涡:2578ms

蛋蛋十三 2020.03.18
sha256("string or binary");

我遇到了其他答案的问题。我建议您将编码参数设置binary为使用字节字符串,并防止Javascript(NodeJS)与其他语言/服务(例如Python,PHP,Github)之间的不同哈希值。

如果不使用此代码,则可以在NodeJS和Python之间获得不同的哈希值。

如何获得与Python,PHP,Perl,Github相同的哈希(并防止出现问题):

NodeJS正在对字符串的UTF-8表示进行哈希处理。其他语言(例如Python,PHP或PERL ...)正在对字节字符串进行哈希处理。

我们可以添加二进制参数来使用字节字符串。

代码:

const crypto = require("crypto");

function sha256(data) {
    return crypto.createHash("sha256").update(data, "binary").digest("base64");
    //                                               ------  binary: hash the byte string
}

sha256("string or binary");

说明文件:

  • crypto.createHash(algorithm [,options]):该算法取决于平台上OpenSSL版本支持的可用算法。
  • hash.digest([encoding]):编码可以是“ hex”,“ latin1”或“ base64”。(基数64的长度要短一些)。

您可能会遇到以下问题:sha256(“ \ xac”),“ \ xd1”,“ \ xb9”,“ \ xe2”,“ \ xbb”,“ \ x93”等。

  • 其他语言(例如PHP,Python,Perl ...)和我的解决方案.update(data, "binary")

    sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47
    
  • 默认情况下,Node.js(无二进制):

    sha1("\xac") //f50eb35d94f1d75480496e54f4b4a472a9148752
    

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android