O que a função s.on () está fazendo? Ele está registrando a função md5sum.update (d) para ser executada toda vez que houver dados sendo lidos no ReadStream?
Woot woot, se require('crypto').createHash('md5').update(STRING_TO_BE_HASHED).digest("hex")você tem uma linha. Cheers companheiro!
balupton
3
Estava tendo alguns problemas usando .updatevárias vezes ( github.com/joyent/node/issues/749 ) ao tentar usar timboooa solução, o conserto de uma linha corrigiu (porque o objeto hash é recriado toda vez).
Max
Alguma maneira de alterar o comprimento da string? Não são apenas 32 caracteres, 64 ou 128 ou um número diferente.
Mikel
@ Mikel tente se houver outros algoritmos de hash que atendam às suas necessidades, o MD5 é sempre de 32 caracteres.
Laços
Se eu tenho muitas strings para hash, é menos eficiente continuar chamando crypto.createHash em vez de reutilizar o resultado?
Michael
81
A API do módulo de criptografia do nó ainda é instável.
A partir da versão 4.0.0, o módulo Crypto nativo não é mais instável. A partir da documentação oficial :
Crypto
Estabilidade: 2 - Estável
A API provou ser satisfatória. A compatibilidade com o ecossistema npm é uma alta prioridade e não será quebrada, a menos que seja absolutamente necessário.
Portanto, deve ser considerado seguro usar a implementação nativa, sem dependências externas.
Para referência, os módulos mencionados abaixo foram sugeridos como soluções alternativas quando o módulo Crypto ainda era instável.
Você também pode usar um dos módulos sha1 ou md5, que fazem o trabalho.
$ npm install sha1
e depois
var sha1 = require('sha1');var hash = sha1("my message");
console.log(hash);// 104ab42f1193c336aa2cf08a2c946d5c6fd0fcdb
ou
$ npm install md5
e depois
var md5 = require('md5');var hash = md5("my message");
console.log(hash);// 8ba6c19dc1def5702ff5acbf2aeea5aa
(O MD5 é inseguro, mas geralmente usado por serviços como o Gravatar.)
Eu acho que é muito mais fácil e eficiente utilizar o Crypto em vez de trazer um módulo totalmente novo.
Valjas 5/13
6
Nos documentos atuais do Node.js.: "Estabilidade: 2 - Instável; as alterações de API estão sendo discutidas para versões futuras. As alterações de última hora serão minimizadas." A API do meu módulo não será alterada. Quando escrevi o módulo inicialmente, não havia nenhumcrypto módulo embutido na plataforma. Outra vantagem é que você pode usar meu módulo no servidor e no lado do cliente. Mas depende totalmente de você, qual biblioteca você usa.
pvorb
7
A compilação nos hashes Crypto continuava me dando a BS 'falha na atualização do hash'. Finalmente, mudei para o módulo MD5 e funcionou muito bem. Também é mais fácil ligar (ligeiramente). Obrigado.
GJK
2
+1 para uma opção que fica longe da (2) - natureza instável da API Crypto!
Geek Cotações
1
Corrigi um problema estranho do sha1 no nó 0.11.x na minha máquina Windows, trocando o uso de criptografia padrão para este módulo.
Bartvds 26/03
24
sha256("string or binary");
Tive um problema com outra resposta. Eu aconselho você a definir o argumento de codificação comobinary para usar a cadeia de bytes e evitar hash diferente entre Javascript (NodeJS) e outros idiomas / serviços como Python, PHP, Github ...
Se você não usar esse código, poderá obter um hash diferente entre o NodeJS e o Python ...
Como obter o mesmo hash que Python, PHP, Perl, Github (e evitar um problema):
O NodeJS está fazendo hash na representação UTF-8 da sequência. Outras linguagens (como Python, PHP ou PERL ...) estão usando hash na string de bytes.
Podemos adicionar argumento binário para usar a sequência de bytes.
Código:
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");
Documentação:
crypto.createHash (algoritmo [, opções]): O algoritmo depende dos algoritmos disponíveis suportados pela versão do OpenSSL na plataforma.
hash.digest ([encoding]): a codificação pode ser 'hex', 'latin1' ou 'base64'. (a base 64 é menos longa).
Você pode obter o problema com: sha256 ("\ xac"), "\ xd1", "\ xb9", "\ xe2", "\ xbb", "\ x93", etc.
Outras linguagens (como PHP, Python, Perl ...) e minha solução com .update(data, "binary"):
Aqui você pode comparar todos os hashes suportados no seu hardware, suportados pela sua versão do node.js. Alguns são criptográficos e outros são apenas para uma soma de verificação. Seu cálculo "Hello World" 1 milhão de vezes para cada algoritmo. Pode levar de 1 a 15 segundos para cada algoritmo (Testado no Google Computing Engine padrão com Node.j 4.2.2).
Eu uso o blueimp-md5, que é "Compatível com ambientes do servidor, como Node.js, carregadores de módulos como RequireJS, Browserify ou webpack e todos os navegadores da web".
Use-o assim:
var md5 = require("blueimp-md5");var myHashedString = createHash('GreensterRox');
createHash(myString){return md5(myString);}
Se passar valores de hash em campo aberto, é sempre uma boa ideia salgá-los para que seja mais difícil para as pessoas recriá-los:
createHash(myString){var salt ='HnasBzbxH9';return md5(myString+salt);}
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));
Mesmo se o hash não for por segurança, você pode usar sha em vez de md5. Na minha opinião, as pessoas devem esquecer o md5 por enquanto, é no passado!
O nodejs sha256 normal foi descontinuado. Então, você tem duas alternativas por enquanto:
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
Prefiro usar em shajsvez de hash, porque hoje considero a melhor função de hash e você não precisa de uma função de hash diferente no momento. Portanto, para obter um hash hexadecimal, você deve fazer algo como o seguinte:
Respostas:
Dê uma olhada no crypto.createHash (algoritmo)
fonte
Se você quiser apenas MD5 hash uma string simples, achei que isso funciona para mim.
fonte
require('crypto').createHash('md5').update(STRING_TO_BE_HASHED).digest("hex")
você tem uma linha. Cheers companheiro!.update
várias vezes ( github.com/joyent/node/issues/749 ) ao tentar usartimbooo
a solução, o conserto de uma linha corrigiu (porque o objeto hash é recriado toda vez).A API do módulo de criptografia do nó ainda é instável.A partir da versão 4.0.0, o módulo Crypto nativo não é mais instável. A partir da documentação oficial :
Portanto, deve ser considerado seguro usar a implementação nativa, sem dependências externas.
Para referência, os módulos mencionados abaixo foram sugeridos como soluções alternativas quando o módulo Crypto ainda era instável.
Você também pode usar um dos módulos sha1 ou md5, que fazem o trabalho.
e depois
ou
e depois
(O MD5 é inseguro, mas geralmente usado por serviços como o Gravatar.)
A API desses módulos não muda!
fonte
crypto
módulo embutido na plataforma. Outra vantagem é que você pode usar meu módulo no servidor e no lado do cliente. Mas depende totalmente de você, qual biblioteca você usa.Tive um problema com outra resposta. Eu aconselho você a definir o argumento de codificação como
binary
para usar a cadeia de bytes e evitar hash diferente entre Javascript (NodeJS) e outros idiomas / serviços como Python, PHP, Github ...Se você não usar esse código, poderá obter um hash diferente entre o NodeJS e o Python ...
Como obter o mesmo hash que Python, PHP, Perl, Github (e evitar um problema):
Podemos adicionar argumento binário para usar a sequência de bytes.
Código:
Documentação:
Você pode obter o problema com: sha256 ("\ xac"), "\ xd1", "\ xb9", "\ xe2", "\ xbb", "\ x93", etc.
Outras linguagens (como PHP, Python, Perl ...) e minha solução com
.update(data, "binary")
:Nodejs por padrão (sem binário):
fonte
O
crypto
módulo torna isso muito fácil.Configuração:
Uso:
fonte
Aqui você pode comparar todos os hashes suportados no seu hardware, suportados pela sua versão do node.js. Alguns são criptográficos e outros são apenas para uma soma de verificação. Seu cálculo "Hello World" 1 milhão de vezes para cada algoritmo. Pode levar de 1 a 15 segundos para cada algoritmo (Testado no Google Computing Engine padrão com Node.j 4.2.2).
Resultado:
DSA: 1992ms
DSA-SHA: 1960ms
DSA-SHA1: 2062ms
DSA-SHA1-antigo: 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-a-SHA1: 1880ms
MD4: 1833ms
md4WithRSAEncryption: 1925ms
md5: 1863ms
md5WithRSAEncryption: 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
fonte
RSA-
prefixos fazem?Forros simples:
Se você deseja o hash de texto UTF8:
Se você deseja obter o mesmo hash com Python, PHP, Perl, Github:
Você também pode substituir
'sha256'
com'sha1'
,'md5'
,'sha256'
,'sha512'
fonte
Considerando os pensamentos de http://www.thoughtcrime.org/blog/the-cryptographic-doom-principle/ (em resumo: PRIMEIRAMENTE criptografar, ENTÃO autenticar. Depois PRIMEIRAMENTE verificar, ENTÃO descriptografar), implementei a seguinte solução no nó. js:
Pode ser testado com:
Espero que isto ajude :-)
fonte
Eu uso o blueimp-md5, que é "Compatível com ambientes do servidor, como Node.js, carregadores de módulos como RequireJS, Browserify ou webpack e todos os navegadores da web".
Use-o assim:
Se passar valores de hash em campo aberto, é sempre uma boa ideia salgá-los para que seja mais difícil para as pessoas recriá-los:
fonte
fonte
Mesmo se o hash não for por segurança, você pode usar sha em vez de md5. Na minha opinião, as pessoas devem esquecer o md5 por enquanto, é no passado!
O nodejs sha256 normal foi descontinuado. Então, você tem duas alternativas por enquanto:
Prefiro usar em
shajs
vez dehash
, porque hoje considero a melhor função de hash e você não precisa de uma função de hash diferente no momento. Portanto, para obter um hash hexadecimal, você deve fazer algo como o seguinte:fonte