node.js哈希字符串?

问题描述 投票:284回答:8

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

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

hash node.js
8个回答
199
投票

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

626
投票

如果你只想md5哈希一个简单的字符串我发现这对我有用。

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

77
投票

Node的加密模块API仍然不稳定。

从版本4.0.0开始,本机Crypto模块不再不稳定。来自official documentation

Crypto

稳定性:2 - 稳定

该API已被证明令人满意。与npm生态系统的兼容性是一个高优先级,除非绝对必要,否则不会被破坏。

因此,在没有外部依赖性的情况下使用本机实现应该被认为是安全的。

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


您也可以使用其中一个模块sha1md5来完成这项工作。

$ 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不会改变!


18
投票
sha256("string or binary");

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

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

How to get the same hash that Python, PHP, Perl, Github (and prevent an issue) :

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
  • Nodejs默认情况下(没有二进制): sha1("\xac") //f50eb35d94f1d75480496e54f4b4a472a9148752

12
投票

crypto模块使这很容易。

建立:

const crypto = require('crypto');

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

用法:

sha256('Hello, world. ');

8
投票

在这里,您可以对您的硬件上所有支持的哈希进行基准测试,您的node.js版本支持这些哈希。有些是加密的,有些只是校验和。它为每个算法计算“Hello World”100万次。每种算法可能需要大约1-15秒(使用Node.js 4.2.2在标准Google Computing Engine上测试)。

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 ripemd160:2153ms ripemd160WithRSA:2210ms rmd160:2146ms 沙:1929ms sha1:1880ms sha1WithRSAEncryption:1957ms sha224:2121ms sha224WithRSAEncryption:2290ms sha256:2134ms sha256WithRSAEncryption:2190ms sha384:2181ms sha384WithRSAEncryption:2343ms sha512:2371ms sha512WithRSAEncryption:2434ms shaWithRSAEncryption:1966ms ssl2-md5:1853ms ssl3-md5:1868ms ssl3-sha1:1971ms 漩涡:2578ms


1
投票

考虑来自http://www.thoughtcrime.org/blog/the-cryptographic-doom-principle/的想法(简而言之:FIRST加密,然后进行身份验证。之后FIRST验证,然后解密)我在node.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); 
    }
}

它可以测试:

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

希望这可以帮助 :-)


1
投票

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

像这样使用它:

var md5 = require("blueimp-md5");

var myHashedString = createHash('GreensterRox');

createHash(myString){
    return md5(myString);
}

如果在打开时传递哈希值,那么将它们加盐以便人们更难以重新创建它们总是一个好主意:

createHash(myString){
    var salt = 'HnasBzbxH9';
    return md5(myString+salt);
}
© www.soinside.com 2019 - 2024. All rights reserved.