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

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


当前回答

简单的一句话:

如果你想要UTF8文本哈希:

const hash = require('crypto').createHash('sha256').update('Hash me', 'utf8').digest('hex');

如果你想用Python, PHP, Perl, Github得到相同的散列:

const hash = require('crypto').createHash('sha256').update('Hash me', 'binary').digest('hex');

你也可以用sha1, md5, sha256, sha512替换sha256

其他回答

简单的一句话:

如果你想要UTF8文本哈希:

const hash = require('crypto').createHash('sha256').update('Hash me', 'utf8').digest('hex');

如果你想用Python, PHP, Perl, Github得到相同的散列:

const hash = require('crypto').createHash('sha256').update('Hash me', 'binary').digest('hex');

你也可以用sha1, md5, sha256, sha512替换sha256

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

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

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

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

作为参考,下面提到的模块是在Crypto模块仍然不稳定时作为替代解决方案提出的。


您还可以使用sha1或md5模块中的一个,它们都可以完成这项工作。

$ npm install sha1

然后

var sha1 = require('sha1');

var hash = sha1("my message");

console.log(hash); // 104ab42f1193c336aa2cf08a2c946d5c6fd0fcdb

or

$ npm install md5

然后

var md5 = require('md5');

var hash = md5("my message");

console.log(hash); // 8ba6c19dc1def5702ff5acbf2aeea5aa

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

这些模块的API不会改变!

考虑到来自 http://www.thoughtcrime.org/blog/the-cryptographic-doom-principle/ (简而言之:首先加密,然后验证。之后先验证,然后解密) 我在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));

希望这对你有所帮助:-)

即使哈希不是为了安全性,您也可以使用sha而不是md5。在我看来,人们现在应该忘记md5,它是过去的事了!

不建议使用普通的nodejs sha256。所以,现在你有两个选择:

var shajs = require('sha.js')  - https://www.npmjs.com/package/sha.js (used by Browserify)

var hash = require('hash.js')  - https://github.com/indutny/hash.js

我更喜欢使用shajs而不是哈希,因为我认为sha是目前最好的哈希函数,你现在不需要一个不同的哈希函数。所以要在十六进制中获得一些哈希,你应该像下面这样做:

sha256.update('hello').digest('hex')
sha256("string or 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");

文档:

加密。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”)/ / 39527 c59247a39d18ad48b9947ea738396a3bc47 默认情况下(不含二进制文件): sha1 / / f50eb35d94f1d75480496e54f4b4a472a9148752(“\ xac”)