string hash node.js?

325

Saya memiliki string yang ingin saya hash. Apa cara termudah untuk menghasilkan hash di node.js?

Hash adalah untuk versi, bukan keamanan.

Harry
sumber

Jawaban:

224

Lihatlah 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);
});
dertkw
sumber
Apa yang sedang dilakukan fungsi s.on ()? Apakah ini mendaftarkan fungsi md5sum.update (d) untuk mengeksekusi setiap kali ada data yang dibaca dari ReadStream?
DucRP
@YoniDor Apakah Anda mencoba fs.readsync ? - Mencerna dalam loop sementara klasik, lalu pastikan itu selesai ... ➝ stackoverflow.com/a/21219407/444255
Frank Nocke
8
OP ingin meng-hash string, bukan file.
Blimpse
699

Jika Anda hanya ingin md5 hash string sederhana saya menemukan ini berfungsi untuk saya.

var crypto = require('crypto');
var name = 'braitsch';
var hash = crypto.createHash('md5').update(name).digest('hex');
console.log(hash); // 9b74c9897bac770ffc029102a200c5de
braitsch
sumber
181
Woot woot, jika Anda melakukannya require('crypto').createHash('md5').update(STRING_TO_BE_HASHED).digest("hex")Anda punya satu-liner. Salut kawan!
balupton
3
Sedang mendapatkan beberapa masalah menggunakan .updatebeberapa kali ( github.com/joyent/node/issues/749 ) ketika mencoba menggunakan timbooosolusi, menggunakan one-liner memperbaikinya (karena objek hash diciptakan kembali setiap waktu).
Maks
Adakah cara untuk mengubah panjang string? Tidak hanya 32 karakter, 64 atau 128 atau nomor yang berbeda.
Mikel
@Mikel coba jika ada algoritma hash lain yang sesuai dengan kebutuhan Anda, md5 selalu 32 karakter.
Ikatan
Jika saya memiliki banyak string untuk hash, itu kurang efisien untuk terus memanggil crypto.createHash daripada entah bagaimana menggunakan kembali hasilnya?
Michael
81

API modul crypto Node masih tidak stabil.

Pada versi 4.0.0, modul Crypto asli tidak lagi stabil. Dari dokumentasi resmi :

Crypto

Stabilitas: 2 - Stabil

API telah terbukti memuaskan. Kompatibilitas dengan ekosistem npm adalah prioritas tinggi, dan tidak akan rusak kecuali benar-benar diperlukan.

Jadi, harus dianggap aman untuk menggunakan implementasi asli, tanpa ketergantungan eksternal.

Untuk referensi, modul yang disebutkan di bawah ini disarankan sebagai solusi alternatif ketika modul Crypto masih tidak stabil.


Anda juga dapat menggunakan salah satu modul sha1 atau md5 yang berfungsi baik.

$ npm install sha1

lalu

var sha1 = require('sha1');

var hash = sha1("my message");

console.log(hash); // 104ab42f1193c336aa2cf08a2c946d5c6fd0fcdb

atau

$ npm install md5

lalu

var md5 = require('md5');

var hash = md5("my message");

console.log(hash); // 8ba6c19dc1def5702ff5acbf2aeea5aa

(MD5 tidak aman tetapi sering digunakan oleh layanan seperti Gravatar.)

API modul-modul ini tidak akan berubah!

pvorb
sumber
9
Saya pikir jauh lebih mudah dan efisien untuk menggunakan Crypto daripada membawa modul baru.
Valjas
6
Dari dokumen Node.js saat ini: "Stabilitas: 2 - Tidak stabil; Perubahan API sedang dibahas untuk versi yang akan datang. Memutuskan perubahan akan diminimalkan." API modul saya tidak akan berubah. Ketika saya awalnya menulis modul, tidak ada crypto modul yang dibangun ke platform. Keuntungan lain adalah Anda dapat menggunakan modul saya di server dan juga di sisi klien. Tapi itu sepenuhnya terserah Anda, perpustakaan apa yang Anda gunakan.
pvorb
7
Membangun hash Crypto terus memberi saya BS 'hash pembaruan gagal'. Akhirnya saya pindah ke modul MD5 dan bekerja dengan baik. Juga lebih mudah untuk dipanggil (sedikit). Terima kasih.
GJK
2
+1 untuk opsi yang menjauh dari (2) - Sifat tidak stabil dari API Crypto!
Saham Geek
1
Saya telah memperbaiki masalah aneh sha1 pada node 0.11.x pada mesin Windows saya dengan menukar kripto standar yang digunakan untuk modul ini.
Bartvds
24
sha256("string or binary");

Saya mengalami masalah dengan jawaban lain. Saya menyarankan Anda untuk mengatur argumen pengkodean binaryuntuk menggunakan string byte dan mencegah hash yang berbeda antara Javascript (NodeJS) dan bahasa lain / layanan seperti Python, PHP, Github ...

Jika Anda tidak menggunakan kode ini, Anda bisa mendapatkan hash berbeda antara NodeJS dan Python ...

Cara mendapatkan hash yang sama dengan Python, PHP, Perl, Github (dan mencegah masalah):

NodeJS mem-hashing representasi string UTF-8. Bahasa lain (seperti Python, PHP atau PERL ...) hashing byte string.

Kita bisa menambahkan argumen biner untuk menggunakan string byte.

Kode:

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

Dokumentasi:

  • crypto.createHash (algoritma [, opsi]): Algoritma ini tergantung pada algoritma yang tersedia yang didukung oleh versi OpenSSL pada platform.
  • hash.digest ([encoding]): Encoding dapat berupa 'hex', 'latin1' atau 'base64'. (base 64 lebih panjang).

Anda bisa mendapatkan masalah dengan: sha256 ("\ xac"), "\ xd1", "\ xb9", "\ xe2", "\ xbb", "\ xbb", "\ x93", dll ...

  • Bahasa lain (seperti PHP, Python, Perl ...) dan solusi saya dengan .update(data, "binary"):

      sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47
  • Nodejs secara default (tanpa biner):

      sha1("\xac") //f50eb35d94f1d75480496e54f4b4a472a9148752
A-312
sumber
15

The cryptomodul membuat ini sangat mudah.

Mempersiapkan:

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

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

Pemakaian:

sha256('Hello, world. ');
sdgfsdh
sumber
10

Di sini Anda dapat membandingkan semua hash yang didukung pada perangkat keras Anda, didukung oleh versi node.js. Beberapa di antaranya adalah kriptografi, dan beberapa hanya untuk sebuah checksum. Ini menghitung "Hello World" 1 juta kali untuk setiap algoritma. Diperlukan waktu sekitar 1-15 detik untuk setiap algoritme (Diuji pada Mesin Komputasi Google Standar dengan 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);  
}

Hasil:
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- SHA: : 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-dengan-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
pusaran air: 2578ms

pengguna3077458
sumber
1
Apa yang dilakukan RSA-awalan?
balupton
7

Simple One Liners:

Jika Anda ingin hash teks UTF8:

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

Jika Anda ingin mendapatkan hash yang sama dengan Python, PHP, Perl, Github:

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

Anda juga dapat mengganti 'sha256'dengan 'sha1', 'md5', 'sha256','sha512'

ayam
sumber
1

Mempertimbangkan pemikiran dari http://www.thoughtcrime.org/blog/the-cryptographic-doom-principle/ (singkatnya: mengenkripsi FIRST, MAKA autentikasi. Setelah itu FIRST memverifikasi, MAKA mendekripsi) Saya telah mengimplementasikan solusi berikut dalam node. 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); 
    }
}

Itu dapat diuji dengan:

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

Semoga ini membantu :-)

batomaeus
sumber
1

Saya menggunakan blueimp-md5 yang "Kompatibel dengan lingkungan sisi server seperti Node.js, pemuat modul seperti RequireJS, Browserify atau webpack dan semua browser web."

Gunakan seperti ini:

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

var myHashedString = createHash('GreensterRox');

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

Jika melewati nilai hash di sekitar di tempat terbuka, selalu ide yang bagus untuk membuatnya jadi lebih sulit bagi orang untuk membuatnya kembali:

createHash(myString){
    var salt = 'HnasBzbxH9';
    return md5(myString+salt);
}
GreensterRox
sumber
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));
Phap
sumber
-1

Bahkan jika hash bukan untuk keamanan, Anda dapat menggunakan sha bukan md5. Menurut pendapat saya, orang-orang harus melupakan md5 untuk saat ini, ini di masa lalu!

Nodejs sha256 normal sudah usang. Jadi, Anda memiliki dua alternatif untuk saat ini:

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

Saya lebih suka menggunakan shajsbukan hash, karena saya menganggap sha fungsi hash terbaik saat ini dan Anda tidak memerlukan fungsi hash yang berbeda untuk saat ini. Jadi untuk mendapatkan hash dalam hex Anda harus melakukan sesuatu seperti berikut:

sha256.update('hello').digest('hex')
Maf
sumber