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); }