首页 文章

node.js哈希字符串?

提问于
浏览
263

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

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

8 回答

  • 9

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

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

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

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

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

    加密稳定性: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这样的服务使用 . )

    The API of these modules won't change!

  • 75
    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");
    

    Documentation:

    • 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
    
  • 1

    crypto 模块使这很容易 .

    Build :

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

    用法:

    sha256('Hello, world. ');
    
  • 1

    在这里,您可以对您的硬件上所有支持的哈希进行基准测试,您的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

  • 580

    考虑来自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));
    

    希望这可以帮助 :-)

  • 186

    我用blueimp-md5这是"Compatible with server-side environments like Node.js, module loaders like RequireJS, Browserify or webpack and all web browsers."

    像这样使用它:

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

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

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

相关问题