node.js karma dizesi?


Yanıtlar:


224

Bir göz atın crypto.createHash (algoritma)

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

S.on () işlevi ne yapıyor? ReadStream öğesinden her veri okunurken yürütmek için md5sum.update (d) işlevi kaydediliyor mu?
DucRP

@YoniDor fs.readsync'i denediniz mi? - Klasik bir döngüde sindirmek, sonra emin olun ... ... stackoverflow.com/a/21219407/444255
Frank Nocke

8
OP bir dosyayı değil bir dizeyi hash etmek istiyor.
blimpse

699

Sadece basit bir dize md5 hash istiyorsanız bu benim için çalışıyor bulundu.

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

181
Woot woot, eğer yaparsan require('crypto').createHash('md5').update(STRING_TO_BE_HASHED).digest("hex")bir astar var. Şerefe arkadaşlar!
balupton

3
Çözümü kullanmaya çalışırken .updatebirden çok kez ( github.com/joyent/node/issues/749 ) kullanarak bazı sorunlar alıyordumtimbooo , tek astarı kullanarak düzeltildi (hash nesnesi her seferinde yeniden oluşturulduğu için).
Max

Dize uzunluğunu değiştirmek için herhangi bir yolu var mı? Sadece 32 karakter değil, 64 veya 128 veya farklı bir sayı.
Mikel

@Mikel, ihtiyaçlarınıza uygun başka karma algoritmalar varsa deneyin, md5 her zaman 32 karakterdir.
Kravatlar

Karma için çok sayıda dizem varsa, sonucu bir şekilde yeniden kullanmak yerine crypto.createHash'ı çağırmaya devam etmek daha az etkilidir?
Michael

81

Düğümün kripto modülü API'sı hala kararsız.

Sürüm 4.0.0'dan itibaren, yerel Kripto modülü artık kararsız değil. Gönderen Resmi belgelerin :

Kripto

Kararlılık: 2 - Kararlı

API'nın tatmin edici olduğu kanıtlanmıştır. Npm ekosistemiyle uyumluluk yüksek bir önceliktir ve kesinlikle gerekli olmadıkça kırılmaz.

Bu nedenle, harici bağımlılıklar olmadan yerel uygulamayı kullanmak güvenli kabul edilmelidir.

Referans olarak, aşağıda belirtilen modüller, Crypto modülü hala kararsız olduğunda alternatif çözümler olarak önerildi.


Her ikisi de işi yapan sha1 veya md5 modüllerinden birini de kullanabilirsiniz .

$ npm install sha1

ve sonra

var sha1 = require('sha1');

var hash = sha1("my message");

console.log(hash); // 104ab42f1193c336aa2cf08a2c946d5c6fd0fcdb

veya

$ npm install md5

ve sonra

var md5 = require('md5');

var hash = md5("my message");

console.log(hash); // 8ba6c19dc1def5702ff5acbf2aeea5aa

(MD5 güvensizdir, ancak genellikle Gravatar gibi hizmetler tarafından kullanılır.)

Bu modüllerin API'ları değişmeyecek!


9
Bence tamamen yeni bir modül getirmek yerine Crypto kullanmak çok daha kolay ve verimli.
Valjas

6
Şu anki Node.js belgelerinden: "Kararlılık: 2 - Kararsız; API değişiklikleri gelecekteki sürümler için tartışılıyor. Breaking değişiklikler en aza indirilecek." Modülümün API'si değişmeyecek. Başlangıçta modülü yazdığımda , platformda yerleşik bir modül yoktu crypto . Başka bir avantaj da modülümü hem sunucuda hem de istemci tarafında kullanabilmenizdir. Ama hangi kütüphaneyi kullandığınız tamamen size kalmış.
pvorb

7
Crypto hashes içindeki yapı bana 'hash update başarısız oldu' BS veriyor. Sonunda MD5 modülüne geçtim ve gayet iyi çalıştı. Ayrıca aramak daha kolay (biraz). Teşekkür ederim.
GJK

2
(2) - Kripto API'sının kararsız doğasından uzak kalan bir seçenek için +1!
Geek Stocks

1
Bu modül için standart kripto kullanımını değiştirerek Windows makinemdeki 0.11.x düğümünde garip bir sha1 sorunu düzelttim.
Bartvds

24
sha256("string or binary");

Başka bir cevapla ilgili sorun yaşadım. Ben binarybayt dizesini kullanmak ve Javascript (NodeJS) ve Python, PHP, Github gibi diğer langage / hizmet arasında farklı karma önlemek için kodlama argümanını ayarlamanızı tavsiye ederiz ...

Bu kodu kullanmazsanız, NodeJS ve Python arasında farklı bir karma elde edebilirsiniz ...

Python, PHP, Perl, Github ile aynı hash nasıl elde edilir (ve bir sorunu önler):

NodeJS, dizenin UTF-8 temsilini karma yapıyor. Diğer diller (Python, PHP veya PERL ... gibi) bayt dizesini hash eder.

Bayt dizesini kullanmak için ikili argüman ekleyebiliriz .

Kod:

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

Belgeler:

  • crypto.createHash (algoritma [, seçenekler]): Algoritma, platformdaki OpenSSL sürümü tarafından desteklenen kullanılabilir algoritmalara bağlıdır.
  • hash.digest ([kodlama]): Kodlama 'hex', 'latin1' veya 'base64' olabilir. (taban 64 daha azdır).

Sorunu şu şekilde alabilirsiniz: sha256 ("\ xac"), "\ xd1", "\ xb9", "\ xe2", "\ xbb", "\ x93", vb ...

  • Diğer diller (PHP, Python, Perl ... gibi) ve benim çözümüm .update(data, "binary"):

    sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47
  • Varsayılan olarak Düğümler (ikili olmadan):

    sha1("\xac") //f50eb35d94f1d75480496e54f4b4a472a9148752

15

cryptoModül çok kolay bu hale getirir.

Kurmak:

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

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

Kullanımı:

sha256('Hello, world. ');

10

Burada, node.js sürümünüz tarafından desteklenen donanımınızdaki tüm desteklenen karmaları karşılaştırabilirsiniz. Bazıları kriptografiktir ve bazıları sadece bir sağlama toplamı içindir. Her algoritma için "Merhaba Dünya" hesaplaması 1 milyon kez. Her algoritma için yaklaşık 1-15 saniye sürebilir (Node.js 4.2.2 ile Standart Google Computing Engine'de test edilmiştir).

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

Sonuç:
DSA: 1992ms
DSA-SHA: 1960ms
DSA-SHA1: 2062ms
DSA-SHA1-eski: 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
DSS-1: 1928ms
ECDSA-ile-SHA1: 1880ms
MD4: Şifreleme
: 1925ms
md5: 1863ms
md5WithRSAEncryption: 1923ms
mdc2: 2729ms
mdc2WithRSA: 2890ms
ripemd: 2101ms
RIPEMD160: 2153ms
ripemd160WithRSA: 2210ms
rmd160: 2146ms
sha: 1929ms
SHA-1: 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
jakuzi: 2578ms


1
Ön RSA-ekler ne işe yarar?
balupton

7

Basit Bir Gömlek:

UTF8 metin karmasını istiyorsanız:

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

Python, PHP, Perl, Github ile aynı karmayı elde etmek istiyorsanız:

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

Ayrıca yerini alabilir 'sha256'ile 'sha1', 'md5', 'sha256','sha512'


1

Http://www.thoughtcrime.org/blog/the-cryptographic-doom-principle/ adresinden gelen düşünceleri göz önünde bulundurarak (kısaca: İLK şifreleme, SONRA kimlik doğrulama. Daha sonra İLK doğrulama, SONRA şifre çözme) Düğüme aşağıdaki çözümü uyguladım. 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); 
    }
}

Şunlarla test edilebilir:

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

Bu yardımcı olur umarım :-)


1

Kullandığım blueimp-md5"Node.js gibi sunucu tarafı ortamlar, RequireJS, Browserify veya webpack gibi modül yükleyiciler ve tüm web tarayıcıları ile uyumlu" .

Şöyle kullanın:

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

var myHashedString = createHash('GreensterRox');

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

Karma değerleri açıkta geçirmek, onları tuzlamak her zaman iyi bir fikirdir, böylece insanların onları yeniden yaratması daha zordur:

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

Karma güvenlik için olmasa bile, md5 yerine sha kullanabilirsiniz. Bence insanlar şimdilik md5'i unutmalı, geçmişte kaldı!

Normal nodejs sha256 kullanımdan kaldırılmıştır. Şimdilik iki alternatifiniz var:

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

Bunun shajsyerine kullanmayı tercih ediyorum hash, çünkü bugünlerde en iyi hash fonksiyonunu düşünüyorum ve şimdilik farklı bir hash fonksiyonuna ihtiyacınız yok. Yani onaltılık bir karma elde etmek için aşağıdaki gibi bir şey yapmalısınız:

sha256.update('hello').digest('hex')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.