node.js hash string?

后端 未结 11 2340
暗喜
暗喜 2020-12-02 03:49

I have a string that I want to hash. What\'s the easiest way to generate the hash in node.js?

The hash is for versioning, not security.

相关标签:
11条回答
  • 2020-12-02 04:09

    If you just want to md5 hash a simple string I found this works for me.

    var crypto = require('crypto');
    var name = 'braitsch';
    var hash = crypto.createHash('md5').update(name).digest('hex');
    console.log(hash); // 9b74c9897bac770ffc029102a200c5de
    
    0 讨论(0)
  • 2020-12-02 04:09

    Even if the hash is not for security, you can use sha instead of md5. In my opinion, the people should forget about md5 for now, it's in the past!

    The normal nodejs sha256 is deprecated. So, you have two alternatives for now:

    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
    

    I prefer using shajs instead of hash, because I consider sha the best hash function nowadays and you don't need a different hash function for now. So to get some hash in hex you should do something like the following:

    sha256.update('hello').digest('hex')
    
    0 讨论(0)
  • 2020-12-02 04:12

    Node's crypto module API is still unstable.

    As of version 4.0.0, the native Crypto module is not unstable anymore. From the official documentation:

    Crypto

    Stability: 2 - Stable

    The API has proven satisfactory. Compatibility with the npm ecosystem is a high priority, and will not be broken unless absolutely necessary.

    So, it should be considered safe to use the native implementation, without external dependencies.

    For reference, the modules mentioned bellow were suggested as alternative solutions when the Crypto module was still unstable.


    You could also use one of the modules sha1 or md5 which both do the job.

    $ npm install sha1
    

    and then

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

    or

    $ npm install md5
    

    and then

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

    (MD5 is insecure but often used by services like Gravatar.)

    The API of these modules won't change!

    0 讨论(0)
  • 2020-12-02 04:13

    I use blueimp-md5 which is "Compatible with server-side environments like Node.js, module loaders like RequireJS, Browserify or webpack and all web browsers."

    Use it like this:

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

    If passing hashed values around in the open it's always a good idea to salt them so that it is harder for people to recreate them:

    createHash(myString){
        var salt = 'HnasBzbxH9';
        return md5(myString+salt);
    }
    
    0 讨论(0)
  • 2020-12-02 04:15
    sha256("string or binary");
    

    I experienced issue with other answer. I advice you to set encoding argument to binary to use the byte string and prevent different hash between Javascript (NodeJS) and other langage/service like Python, PHP, Github...

    If you don't use this code, you can get a different hash between NodeJS and Python...

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

    NodeJS is hashing the UTF-8 representation of the string. Other languages (like Python, PHP or PERL...) are hashing the byte string.

    We can add binary argument to use the byte string.

    Code :

    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]): The algorithm is dependent on the available algorithms supported by the version of OpenSSL on the platform.
    • hash.digest([encoding]): The encoding can be 'hex', 'latin1' or 'base64'. (base 64 is less longer).

    You can get the issue with : sha256("\xac"), "\xd1", "\xb9", "\xe2", "\xbb", "\x93", etc...

    • Other languages (like PHP, Python, Perl...) and my solution with .update(data, "binary") :

        sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47
      
    • Nodejs by default (without binary) :

        sha1("\xac") //f50eb35d94f1d75480496e54f4b4a472a9148752
      
    0 讨论(0)
  • 2020-12-02 04:16

    The crypto module makes this very easy.

    Setup:

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

    Usage:

    sha256('Hello, world. ');
    
    0 讨论(0)
提交回复
热议问题