node.js哈希string?

我有一个string,我想散列。 在node.js中生成散列最简单的方法是什么?

散列用于版本控制,而不是安全性。

谢谢。

看看crypto.createHash(algorithm)

var filename = process.argv[2]; var crypto = require('crypto'); var fs = require('fs'); var md5sum = crypto.createHash('md5'); var s = fs.ReadStream(filename); s.on('data', function(d) { md5sum.update(d); }); s.on('end', function() { var d = md5sum.digest('hex'); console.log(d + ' ' + filename); }); 

如果你只是想md5哈希一个简单的string,我发现这对我有用。

 var crypto = require('crypto'); var name = 'braitsch'; var hash = crypto.createHash('md5').update(name).digest('hex'); console.log(hash); // 9b74c9897bac770ffc029102a200c5de 

巴达兵

节点的encryption模块API仍然不稳定。

从版本4.0.0开始,本地Crypto模块不再不稳定。 从官方文档 :

encryption

稳定性:2 – 稳定

API已被certificate是令人满意的。 与npm生态系统的兼容性是重中之重,除非绝对必要,否则不会被打破。

所以,应该认为使用本地实现是安全的,没有外部依赖。

作为参考,当Crypto模块仍然不稳定时,build议将下面提到的模块作为替代解决scheme。


你也可以使用其中一个模块sha1或md5这两个工作。

 $ npm install sha1 

接着

 var sha1 = require('sha1'); var hash = sha1("my message"); console.log(hash); // 104ab42f1193c336aa2cf08a2c946d5c6fd0fcdb 

要么

 $ npm install md5 

接着

 var md5 = require('md5'); var hash = md5("my message"); console.log(hash); // 8ba6c19dc1def5702ff5acbf2aeea5aa 

(MD5是不安全的,但经常被像Gravatar这样的服务使用。)

这些模块的API不会改变!

简单的function:

 var crypto = require('crypto'); function sha256(data) { return crypto.createHash("sha256").update(data).digest("base64"); } 

和:

 sha256("string"); 

crypto模块使这非常简单。

build立:

 const crypto = require('crypto'); const sha256 = x => crypto.createHash('sha256').update(x, 'utf8').digest('hex'); 

用法:

 sha256('Hello, world. '); 

在这里,您可以在您的硬件上testing所有受支持的散列,并由您的node.js版本支持。 有些是encryption的,有些只是用于校验和。 它为每个algorithm计算“Hello World”100万次。 每个algorithm可能需要大约1-15秒(在带有Node.js 4.2.2的标准Google计算引擎上testing)。

 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-with-SHA1:1880ms
md4:1833ms
md4WithRSAEncryption:1925ms
md5:1863ms
md5WithRSAEncryption:1923ms
mdc2:2729ms
mdc2WithRSA:2890ms
成熟时间:2101ms
成熟160:2153ms
成熟160跟RSA:2210ms
rmd160:2146ms
沙:1929ms
sha1:1880ms
sha1WithRSAEncryption:1957ms
sha224:2121ms
sha224WithRSAEencryption:2290ms
sha256:2134ms
sha256WithRSAEencryption:2190ms
sha384:2181ms
sha384WithRSAEncryption:2343ms
sha512:2371ms
sha512WithRSAEncryption:2434ms
shaWithRSAEncryption:1966ms
ssl2-md5:1853ms
ssl3-md5:1868ms
ssl3-sha1:1971ms
漩涡:2578ms

考虑到http://www.thoughtcrime.org/blog/the-cryptographic-doom-principle/ (简称:FIRSTencryption,然后validation,然后FIRSTvalidation,THEN解密)的思想,我在节点中实现了以下解决scheme。 JS:

 function encrypt(text,password){ var cipher = crypto.createCipher(algorithm,password) var crypted = cipher.update(text,'utf8','hex') crypted += cipher.final('hex'); return crypted; } function decrypt(text,password){ var decipher = crypto.createDecipher(algorithm,password) var dec = decipher.update(text,'hex','utf8') dec += decipher.final('utf8'); return dec; } function hashText(text){ var hash = crypto.createHash('md5').update(text).digest("hex"); //console.log(hash); return hash; } function encryptThenAuthenticate(plainText,pw) { var encryptedText = encrypt(plainText,pw); var hash = hashText(encryptedText); return encryptedText+"$"+hash; } function VerifyThenDecrypt(encryptedAndAuthenticatedText,pw) { var encryptedAndHashArray = encryptedAndAuthenticatedText.split("$"); var encrypted = encryptedAndHashArray[0]; var hash = encryptedAndHashArray[1]; var hash2Compare = hashText(encrypted); if (hash === hash2Compare) { return decrypt(encrypted,pw); } } 

它可以用以下方法testing:

 var doom = encryptThenAuthenticate("The encrypted text",user.cryptoPassword); console.log(VerifyThenDecrypt(doom,user.cryptoPassword)); 

希望这可以帮助 :-)

我使用blueimp-md5 ,它与Node.js等服务器端环境兼容,RequireJS,Browserify或webpack等模块加载器以及所有Web浏览器兼容。

像这样使用它:

 var md5 = require("blueimp-md5"); var myHashedString = createHash('GreensterRox'); createHash(myString){ return md5(myString); } 

如果在开放的时候传递哈希值,那么对它们进行盐化总是一个好主意,这样人们很难重新创build它们:

 createHash(myString){ var salt = 'HnasBzbxH9'; return md5(myString+salt); }