wake-up-neo.net

node.js Hash-String?

Ich habe eine Zeichenfolge, die ich haschen möchte. Was ist der einfachste Weg, um den Hash in node.js zu generieren?

Der Hash dient der Versionierung und nicht der Sicherheit.

294
Harry

Schauen Sie sich crypto.createHash (algorithm) an

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

Wenn Sie nur einen einfachen String md5-Hash wollen, fand ich, dass dies für mich funktioniert.

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

Die Kryptomodul-API des Knotens ist immer noch instabil.

Ab Version 4.0.0 ist das native Crypto-Modul nicht mehr instabil. Aus der offiziellen Dokumentation :

Krypto

Stabilität: 2 - Stabil

Die API hat sich bewährt. Die Kompatibilität mit dem npm-Ökosystem hat hohe Priorität und wird nur dann unterbrochen, wenn dies unbedingt erforderlich ist.

Es sollte daher als sicher angesehen werden, die native Implementierung ohne externe Abhängigkeiten zu verwenden.

Als Referenz wurden die unten genannten Module als alternative Lösungen vorgeschlagen, als das Crypto-Modul noch instabil war.


Sie können auch eines der Module sha1 oder md5 verwenden, die beide den Job erledigen.

$ npm install sha1

und dann

var sha1 = require('sha1');

var hash = sha1("my message");

console.log(hash); // 104ab42f1193c336aa2cf08a2c946d5c6fd0fcdb

oder

$ npm install md5

und dann

var md5 = require('md5');

var hash = md5("my message");

console.log(hash); // 8ba6c19dc1def5702ff5acbf2aeea5aa

(MD5 ist unsicher, wird jedoch häufig von Diensten wie Gravatar verwendet.)

Die API dieser Module wird sich nicht ändern!

77
pvorb
sha256("string or binary");

Ich habe ein Problem mit einer anderen Antwort festgestellt. Ich rate Ihnen, das Codierungsargument auf binary zu setzen, um die Byte-Zeichenfolge zu verwenden und unterschiedlichen Hash zwischen Javascript (NodeJS) und anderen Sprachen/Diensten wie Python, PHP, Github ... zu verhindern.

Wenn Sie diesen Code nicht verwenden, können Sie einen anderen Hash zwischen NodeJS und Python erhalten ...

So erhalten Sie denselben Hash wie Python, PHP, Perl, Github (und verhindern ein Problem):

NodeJS hasht die UTF-8-Darstellung des Strings. Andere Sprachen (wie Python, PHP oder Perl ...)) hacken den Byte-String.

Wir können ein binäres Argument hinzufügen, um die Byte-Zeichenfolge zu verwenden.

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

Dokumentation:

  • crypto.createHash (algorithm [ options]): Der Algorithmus ist abhängig von den verfügbaren Algorithmen, die von der OpenSSL-Version auf der Plattform unterstützt werden.
  • hash.digest ([encoding]): Die Codierung kann 'hex', 'latin1' oder 'base64' sein. (Basis 64 ist kürzer).

Sie erhalten das Problem mit: sha256 ("\ xac"), "\ xd1", "\ xb9", "\ xe2", "\ xbb", "\ x93" usw.

  • Andere Sprachen (wie PHP, Python, Perl ...) und meine Lösung mit .update(data, "binary"):

    sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47
    
  • Nodejs standardmäßig (ohne Binär):

    sha1("\xac") //f50eb35d94f1d75480496e54f4b4a472a9148752
    
18
A-312

Das crypto Modul macht dies sehr einfach.

Konfiguration:

const crypto = require('crypto');

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

Verwendungszweck:

sha256('Hello, world. ');
12
sdgfsdh

Hier können Sie alle unterstützten Hashes auf Ihrer Hardware vergleichen, die von Ihrer Version von node.js unterstützt werden. Einige sind kryptografisch, andere dienen nur der Prüfsumme. Es berechnet "Hello World" 1 Million Mal für jeden Algorithmus. Es kann ungefähr 1-15 Sekunden für jeden Algorithmus dauern (Getestet auf der Standard Google Computing Engine mit 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);  
}

Ergebnis:
DSA: 1992ms
DSA-SHA: 1960 ms
DSA-SHA1: 2062 ms
DSA-SHA1-alt: 2124 ms
[...] RSA-MD4: 1893 ms
[...] RSA-MD5: 1982ms
RSA-MDC2: 2797 ms
RSA-RIPEMD160: 2101ms
RSA-SHA: 1948 ms
RSA-SHA1: 1908 ms
[...] RSA-SHA1-2: 2042ms
RSA-SHA224: 2176 ms
RSA-SHA256: 2158 ms
[...] RSA-SHA384: 2290 ms
[...] RSA-SHA512: 2357 ms
dsaEncryption: 1936 ms
dsaWithSHA: 1910ms
dsaWithSHA1: 1926ms
dss1: 1928ms
ecdsa-with-SHA1: 1880 ms
md4: 1833 ms
md4WithRSAEncryption: 1925 ms
md5: 1863 ms
md5WithRSAEncryption: 1923 ms
mdc2: 2729 ms
mdc2WithRSA: 2890 ms
gereift: 2101ms
ripemd160: 2153ms
ripemd160WithRSA: 2210ms
rmd160: 2146 ms
sha: 1929 ms
sha1: 1880 ms
sha1WithRSAEncryption: 1957 ms
sha224: 2121ms
sha224WithRSAEncryption: 2290 ms
[...] sha256: 2134ms
sha256WithRSAEncryption: 2190ms
[...] sha384: 2181ms
sha384WithRSAEncryption: 2343 ms
sha512: 2371ms
sha512WithRSAEncryption: 2434 ms
shaWithRSAEncryption: 1966 ms
ssl2-md5: 1853 ms
ssl3-md5: 1868 ms
ssl3-sha1: 1971 ms
Whirlpool: 2578 ms

8
user3077458

Ich benutze blueimp-md5 welches "Kompatibel mit serverseitigen Umgebungen wie Node.js, Modulladern wie RequireJS, Browserify oder Webpack und allen Webbrowsern" ist.

Benutze es so:

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

var myHashedString = createHash('GreensterRox');

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

Wenn gehashte Werte offen herumgereicht werden, ist es immer eine gute Idee, sie zu salzen, damit es für die Leute schwieriger ist, sie neu zu erstellen:

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

Unter Berücksichtigung der Gedanken von http://www.thoughtcrime.org/blog/the-cryptographic-Doom-principle/ (kurz: ZUERST verschlüsseln, DANN authentifizieren. Danach ZUERST verifizieren, DANN entschlüsseln) habe ich hat die folgende Lösung in node.js implementiert:

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

Es kann getestet werden mit:

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

Hoffe das hilft :-)

1
batomaeus

Auch wenn der Hash nicht der Sicherheit dient, können Sie sha anstelle von md5 verwenden. Meiner Meinung nach sollten die Leute md5 vorerst vergessen, es ist in der Vergangenheit!

Der normale Knoten sha256 ist veraltet. Sie haben also vorerst zwei Alternativen:

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

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

Ich bevorzuge die Verwendung von shajs anstelle von hash, da ich sie heutzutage für die beste Hash-Funktion halte und Sie momentan keine andere Hash-Funktion benötigen. Um also einen Hash in hex zu erhalten, sollten Sie etwa Folgendes tun: sha256.update('hello').digest('hex').

0