stringa hash node.js?


Risposte:


224

Dai un'occhiata a crypto.createHash (algoritmo)

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

Che cosa sta facendo la funzione s.on ()? Sta registrando la funzione md5sum.update (d) da eseguire ogni volta che ci sono dati letti dal ReadStream?
DucRP,

@YoniDor Hai provato fs.readsync ? - Digestione in un classico ciclo continuo, quindi assicurati che sia fatto ... ➝ stackoverflow.com/a/21219407/444255
Frank Nocke,

8
OP vuole eseguire l'hashing di una stringa, non di un file.
dirigere il

699

Se vuoi solo fare un hash md5 con una semplice stringa, ho scoperto che funziona per me.

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

181
Woot woot, se lo fai require('crypto').createHash('md5').update(STRING_TO_BE_HASHED).digest("hex")hai una fodera. Saluti amico!
Balupton,

3
Stavo riscontrando alcuni problemi usando .updatepiù volte ( github.com/joyent/node/issues/749 ) quando cercavo di usare timbooola soluzione, usando il one-liner è stato risolto (perché l'oggetto hash viene ricreato ogni volta).
Max

Qualche modo per cambiare la lunghezza della stringa? Non solo 32 caratteri, 64 o 128 o un numero diverso.
Mikel,

@Mikel prova se ci sono altri algoritmi di hash che soddisfano le tue esigenze, md5 ha sempre 32 caratteri.
Lega il

Se ho molte stringhe di hash, è meno efficiente continuare a chiamare crypto.createHash invece di riutilizzare in qualche modo il risultato?
Michael,

81

L'API del modulo di crittografia del nodo è ancora instabile.

A partire dalla versione 4.0.0, il modulo Crypto nativo non è più instabile. Dalla documentazione ufficiale :

Crypto

Stabilità: 2 - Stabile

L'API si è dimostrata soddisfacente. La compatibilità con l'ecosistema npm è una priorità assoluta e non verrà interrotta se non in caso di assoluta necessità.

Pertanto, dovrebbe essere considerato sicuro utilizzare l'implementazione nativa, senza dipendenze esterne.

Per riferimento, i moduli indicati di seguito sono stati suggeriti come soluzioni alternative quando il modulo Crypto era ancora instabile.


È inoltre possibile utilizzare uno dei moduli sha1 o md5 che svolgono entrambi il lavoro.

$ npm install sha1

e poi

var sha1 = require('sha1');

var hash = sha1("my message");

console.log(hash); // 104ab42f1193c336aa2cf08a2c946d5c6fd0fcdb

o

$ npm install md5

e poi

var md5 = require('md5');

var hash = md5("my message");

console.log(hash); // 8ba6c19dc1def5702ff5acbf2aeea5aa

(MD5 è insicuro ma spesso utilizzato da servizi come Gravatar.)

L'API di questi moduli non cambierà!


9
Penso che sia molto più semplice ed efficiente utilizzare Crypto piuttosto che introdurre un modulo completamente nuovo.
Valjas,

6
Dagli attuali documenti Node.js: "Stabilità: 2 - instabile; le modifiche alle API sono in discussione per le versioni future. Le ultime modifiche saranno ridotte al minimo." L'API del mio modulo non cambierà. Quando inizialmente ho scritto il modulo, non c'era nessun crypto modulo integrato nella piattaforma. Un altro vantaggio è che puoi usare il mio modulo sia sul server che sul lato client. Ma dipende totalmente da te, quale libreria usi.
pvorb,

7
La build negli hash di Crypto continuava a darmi BS "aggiornamento hash fallito". Alla fine sono passato al modulo MD5 e ha funzionato perfettamente. Anche più facile da chiamare (leggermente). Grazie.
GJK

2
+1 per un'opzione che rimane lontana dalla (2) - natura instabile dell'API Crypto!
Azioni Geek il

1
Ho risolto uno strano problema sha1 sul nodo 0.11.x sul mio computer Windows scambiando l'uso crittografico standard per questo modulo.
Bartvds,

24
sha256("string or binary");

Ho riscontrato problemi con altre risposte. Ti consiglio di impostare l'argomento di codifica binaryper utilizzare la stringa di byte e prevenire diversi hash tra Javascript (NodeJS) e altri linguaggi / servizi come Python, PHP, Github ...

Se non usi questo codice, puoi ottenere un hash diverso tra NodeJS e Python ...

Come ottenere lo stesso hash di Python, PHP, Perl, Github (e prevenire un problema):

NodeJS esegue l'hashing della rappresentazione UTF-8 della stringa. Altre lingue (come Python, PHP o PERL ...) eseguono l'hashing della stringa di byte.

Possiamo aggiungere un argomento binario per usare la stringa di byte.

Codice :

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

Documentazione:

  • crypto.createHash (algoritmo [, opzioni]): l'algoritmo dipende dagli algoritmi disponibili supportati dalla versione di OpenSSL sulla piattaforma.
  • hash.digest ([codifica]): la codifica può essere 'hex', 'latin1' o 'base64'. (la base 64 è meno lunga).

È possibile ottenere il problema con: sha256 ("\ xac"), "\ xd1", "\ xb9", "\ xe2", "\ xbb", "\ x93", ecc ...

  • Altre lingue (come PHP, Python, Perl ...) e la mia soluzione con .update(data, "binary"):

      sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47
  • Nodejs di default (senza binario):

      sha1("\xac") //f50eb35d94f1d75480496e54f4b4a472a9148752

15

Il cryptomodulo lo rende molto semplice.

Impostare:

// import crypto from 'crypto';
const crypto = require('crypto');

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

Uso:

sha256('Hello, world. ');

10

Qui puoi confrontare tutti gli hash supportati sul tuo hardware, supportati dalla tua versione di node.js. Alcuni sono crittografici e altri sono solo per un checksum. Calcola "Hello World" 1 milione di volte per ogni algoritmo. Potrebbero essere necessari circa 1-15 secondi per ciascun algoritmo (testato su Google Computing Engine standard con Node.js 4.2.2).

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

Risultato:
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-con-SHA1: 1880ms
MD4: 1833ms md4WithRSA
Crittografia: 1925ms
md5: 1863ms
md5WithRSA Crittografia: 1923ms
mdc2: 2729ms
mdc2WithRSA: 2890ms
RIPEMD: 2101ms
RIPEMD160: 2153ms
ripemd160WithRSA: 2210ms
rmd160: 2146ms
sha: 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
whirlpool: 2578ms


1
Cosa fanno i RSA-prefissi?
Balupton,

7

Liners semplici:

Se vuoi l'hash del testo UTF8:

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

Se vuoi ottenere lo stesso hash con Python, PHP, Perl, Github:

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

È inoltre possibile sostituire 'sha256'con 'sha1', 'md5', 'sha256','sha512'


1

Considerando i pensieri di http://www.thoughtcrime.org/blog/the-cryptographic-doom-principle/ (in breve: PRIMA crittografia, quindi autenticazione. Successivamente PRIMA verifica, POI decrittografia) Ho implementato la seguente soluzione nel nodo. 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); 
    }
}

Può essere testato con:

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

Spero che questo ti aiuti :-)


1

Uso blueimp-md5 che è "Compatibile con ambienti lato server come Node.js, caricatori di moduli come RequireJS, Browserify o webpack e tutti i browser web".

Usalo in questo modo:

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

var myHashedString = createHash('GreensterRox');

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

Se passare valori hash all'aperto è sempre una buona idea salarli in modo che sia più difficile per loro ricrearli:

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

1
function md5(a) {
    var r = 0,
        c = "";
    return h(a);

    function h(t) {
        return u(l(m(t)))
    }

    function l(t) {
        return p(g(f(t), 8 * t.length))
    }

    function u(t) {
        for (var e, i = r ? "0123456789ABCDEF" : "0123456789abcdef", n = "", o = 0; o < t.length; o++)
            e = t.charCodeAt(o),
            n += i.charAt(e >>> 4 & 15) + i.charAt(15 & e);
        return n
    }

    function m(t) {
        for (var e, i, n = "", o = -1; ++o < t.length;)
            e = t.charCodeAt(o),
            i = o + 1 < t.length ? t.charCodeAt(o + 1) : 0,
            55296 <= e && e <= 56319 && 56320 <= i && i <= 57343 && (e = 65536 + ((1023 & e) << 10) + (1023 & i),
                o++),
            e <= 127 ? n += String.fromCharCode(e) : e <= 2047 ? n += String.fromCharCode(192 | e >>> 6 & 31, 128 | 63 & e) : e <= 65535 ? n += String.fromCharCode(224 | e >>> 12 & 15, 128 | e >>> 6 & 63, 128 | 63 & e) : e <= 2097151 && (n += String.fromCharCode(240 | e >>> 18 & 7, 128 | e >>> 12 & 63, 128 | e >>> 6 & 63, 128 | 63 & e));
        return n
    }

    function f(t) {
        for (var e = Array(t.length >> 2), i = 0; i < e.length; i++)
            e[i] = 0;
        for (i = 0; i < 8 * t.length; i += 8)
            e[i >> 5] |= (255 & t.charCodeAt(i / 8)) << i % 32;
        return e
    }

    function p(t) {
        for (var e = "", i = 0; i < 32 * t.length; i += 8)
            e += String.fromCharCode(t[i >> 5] >>> i % 32 & 255);
        return e
    }

    function g(t, e) {
        t[e >> 5] |= 128 << e % 32,
            t[14 + (e + 64 >>> 9 << 4)] = e;
        for (var i = 1732584193, n = -271733879, o = -1732584194, s = 271733878, a = 0; a < t.length; a += 16) {
            var r = i,
                c = n,
                h = o,
                l = s;
            n = E(n = E(n = E(n = E(n = N(n = N(n = N(n = N(n = C(n = C(n = C(n = C(n = S(n = S(n = S(n = S(n, o = S(o, s = S(s, i = S(i, n, o, s, t[a + 0], 7, -680876936), n, o, t[a + 1], 12, -389564586), i, n, t[a + 2], 17, 606105819), s, i, t[a + 3], 22, -1044525330), o = S(o, s = S(s, i = S(i, n, o, s, t[a + 4], 7, -176418897), n, o, t[a + 5], 12, 1200080426), i, n, t[a + 6], 17, -1473231341), s, i, t[a + 7], 22, -45705983), o = S(o, s = S(s, i = S(i, n, o, s, t[a + 8], 7, 1770035416), n, o, t[a + 9], 12, -1958414417), i, n, t[a + 10], 17, -42063), s, i, t[a + 11], 22, -1990404162), o = S(o, s = S(s, i = S(i, n, o, s, t[a + 12], 7, 1804603682), n, o, t[a + 13], 12, -40341101), i, n, t[a + 14], 17, -1502002290), s, i, t[a + 15], 22, 1236535329), o = C(o, s = C(s, i = C(i, n, o, s, t[a + 1], 5, -165796510), n, o, t[a + 6], 9, -1069501632), i, n, t[a + 11], 14, 643717713), s, i, t[a + 0], 20, -373897302), o = C(o, s = C(s, i = C(i, n, o, s, t[a + 5], 5, -701558691), n, o, t[a + 10], 9, 38016083), i, n, t[a + 15], 14, -660478335), s, i, t[a + 4], 20, -405537848), o = C(o, s = C(s, i = C(i, n, o, s, t[a + 9], 5, 568446438), n, o, t[a + 14], 9, -1019803690), i, n, t[a + 3], 14, -187363961), s, i, t[a + 8], 20, 1163531501), o = C(o, s = C(s, i = C(i, n, o, s, t[a + 13], 5, -1444681467), n, o, t[a + 2], 9, -51403784), i, n, t[a + 7], 14, 1735328473), s, i, t[a + 12], 20, -1926607734), o = N(o, s = N(s, i = N(i, n, o, s, t[a + 5], 4, -378558), n, o, t[a + 8], 11, -2022574463), i, n, t[a + 11], 16, 1839030562), s, i, t[a + 14], 23, -35309556), o = N(o, s = N(s, i = N(i, n, o, s, t[a + 1], 4, -1530992060), n, o, t[a + 4], 11, 1272893353), i, n, t[a + 7], 16, -155497632), s, i, t[a + 10], 23, -1094730640), o = N(o, s = N(s, i = N(i, n, o, s, t[a + 13], 4, 681279174), n, o, t[a + 0], 11, -358537222), i, n, t[a + 3], 16, -722521979), s, i, t[a + 6], 23, 76029189), o = N(o, s = N(s, i = N(i, n, o, s, t[a + 9], 4, -640364487), n, o, t[a + 12], 11, -421815835), i, n, t[a + 15], 16, 530742520), s, i, t[a + 2], 23, -995338651), o = E(o, s = E(s, i = E(i, n, o, s, t[a + 0], 6, -198630844), n, o, t[a + 7], 10, 1126891415), i, n, t[a + 14], 15, -1416354905), s, i, t[a + 5], 21, -57434055), o = E(o, s = E(s, i = E(i, n, o, s, t[a + 12], 6, 1700485571), n, o, t[a + 3], 10, -1894986606), i, n, t[a + 10], 15, -1051523), s, i, t[a + 1], 21, -2054922799), o = E(o, s = E(s, i = E(i, n, o, s, t[a + 8], 6, 1873313359), n, o, t[a + 15], 10, -30611744), i, n, t[a + 6], 15, -1560198380), s, i, t[a + 13], 21, 1309151649), o = E(o, s = E(s, i = E(i, n, o, s, t[a + 4], 6, -145523070), n, o, t[a + 11], 10, -1120210379), i, n, t[a + 2], 15, 718787259), s, i, t[a + 9], 21, -343485551),
                i = v(i, r),
                n = v(n, c),
                o = v(o, h),
                s = v(s, l)
        }
        return [i, n, o, s]
    }

    function _(t, e, i, n, o, s) {
        return v((a = v(v(e, t), v(n, s))) << (r = o) | a >>> 32 - r, i);
        var a, r
    }

    function S(t, e, i, n, o, s, a) {
        return _(e & i | ~e & n, t, e, o, s, a)
    }

    function C(t, e, i, n, o, s, a) {
        return _(e & n | i & ~n, t, e, o, s, a)
    }

    function N(t, e, i, n, o, s, a) {
        return _(e ^ i ^ n, t, e, o, s, a)
    }

    function E(t, e, i, n, o, s, a) {
        return _(i ^ (e | ~n), t, e, o, s, a)
    }

    function v(t, e) {
        var i = (65535 & t) + (65535 & e);
        return (t >> 16) + (e >> 16) + (i >> 16) << 16 | 65535 & i
    }
}
string = 'hello';
console.log(md5(string));

-1

Anche se l'hash non è per sicurezza, puoi usare sha invece di md5. Secondo me, la gente dovrebbe dimenticare md5 per ora, è nel passato!

Il normale nodejs sha256 è obsoleto. Quindi, hai due alternative per ora:

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

Preferisco usare shajsinvece di hash, perché considero sha la migliore funzione hash al giorno d'oggi e per ora non hai bisogno di una funzione hash diversa. Quindi per ottenere un po 'di hash in hex dovresti fare qualcosa del tipo:

sha256.update('hello').digest('hex')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.