chuỗi băm node.js?


Câu trả lời:


224

Hãy xem crypto.createHash (thuật toán)

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

Hàm s.on () đang làm gì? Có phải nó đang đăng ký hàm md5sum.update (d) để thực thi mỗi khi có dữ liệu được đọc từ ReadStream không?
DucRP 14/07/2015

@YoniDor Bạn đã thử fs.readsync chưa? - Tiêu hóa theo vòng lặp while cổ điển, sau đó hãy chắc chắn rằng nó đã hoàn thành ... stackoverflow.com/a/21219407/444255
Frank Nocke 15/2/2016

8
OP muốn băm một chuỗi, không phải là một tập tin.
nháy mắt

697

Nếu bạn chỉ muốn md5 băm một chuỗi đơn giản, tôi thấy điều này làm việc cho tôi.

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

181
Woot woot, nếu require('crypto').createHash('md5').update(STRING_TO_BE_HASHED).digest("hex")bạn có một lót. Cổ vũ người bạn đời!
balupton

3
Đã gặp một số vấn đề khi sử dụng .updatenhiều lần ( github.com/joyent/node/issues/749 ) khi cố gắng sử dụng timbooogiải pháp của mình, sử dụng một lớp lót đã sửa nó (vì đối tượng băm được tạo lại mỗi lần).
Tối đa

Bất kỳ cách nào để thay đổi độ dài của chuỗi? Không chỉ có 32 ký tự, 64 hoặc 128 hoặc một số khác.
Mikel

@Mikel thử nếu có các thuật toán băm khác phù hợp với nhu cầu của bạn, md5 luôn có 32 ký tự.
Ties

Nếu tôi có nhiều chuỗi để băm, việc gọi crypto.createHash sẽ kém hiệu quả hơn thay vì sử dụng lại kết quả bằng cách nào đó?
Michael

81

API mô-đun mật mã của Node vẫn không ổn định.

Kể từ phiên bản 4.0.0, mô-đun Crypto gốc không còn ổn định nữa. Từ tài liệu chính thức :

Tiền điện tử

Ổn định: 2 - Ổn định

API đã được chứng minh thỏa đáng. Khả năng tương thích với hệ sinh thái npm là ưu tiên cao và sẽ không bị phá vỡ trừ khi thực sự cần thiết.

Vì vậy, nó được coi là an toàn để sử dụng thực hiện riêng, không phụ thuộc bên ngoài.

Để tham khảo, các mô-đun được đề cập dưới đây được đề xuất là giải pháp thay thế khi mô-đun Crypto vẫn không ổn định.


Bạn cũng có thể sử dụng một trong các mô-đun sha1 hoặc md5 mà cả hai đều thực hiện công việc.

$ npm install sha1

và sau đó

var sha1 = require('sha1');

var hash = sha1("my message");

console.log(hash); // 104ab42f1193c336aa2cf08a2c946d5c6fd0fcdb

hoặc là

$ npm install md5

và sau đó

var md5 = require('md5');

var hash = md5("my message");

console.log(hash); // 8ba6c19dc1def5702ff5acbf2aeea5aa

(MD5 không an toàn nhưng thường được sử dụng bởi các dịch vụ như Gravatar.)

API của các mô-đun này sẽ không thay đổi!


9
Tôi nghĩ việc sử dụng Crypto sẽ dễ dàng và hiệu quả hơn nhiều so với việc mang đến một mô-đun hoàn toàn mới.
Valjas

6
Từ các tài liệu Node.js hiện tại: "Tính ổn định: 2 - Không ổn định; các thay đổi API đang được thảo luận cho các phiên bản trong tương lai. Các thay đổi đột phá sẽ được giảm thiểu." API của mô-đun của tôi sẽ không thay đổi. Khi tôi ban đầu viết mô-đun, không có crypto mô-đun nào được tích hợp vào nền tảng. Một lợi thế khác là bạn có thể sử dụng mô-đun của tôi trên máy chủ cũng như phía máy khách. Nhưng nó hoàn toàn phụ thuộc vào bạn, bạn sử dụng thư viện nào.
pvorb

7
Việc xây dựng băm Crypto tiếp tục mang đến cho tôi 'bản cập nhật băm không thành công' BS. Cuối cùng tôi chuyển sang mô-đun MD5 và nó hoạt động tốt. Cũng dễ gọi hơn (hơi). Cảm ơn bạn.
GJK

2
+1 cho một tùy chọn tránh xa (2) - Bản chất không ổn định của API Crypto!
Cổ phiếu Geek

1
Tôi đã khắc phục sự cố sha1 kỳ lạ trên nút 0.11.x trên máy Windows của mình bằng cách hoán đổi việc sử dụng tiền điện tử tiêu chuẩn cho mô-đun này.
Bartvds

24
sha256("string or binary");

Tôi có kinh nghiệm vấn đề với câu trả lời khác. Tôi khuyên bạn nên đặt đối số mã hóa thànhbinary để sử dụng chuỗi byte và ngăn băm khác nhau giữa Javascript (NodeJS) và các langage / dịch vụ khác như Python, PHP, Github ...

Nếu bạn không sử dụng mã này, bạn có thể nhận được một hàm băm khác nhau giữa NodeJS và Python ...

Cách nhận cùng hàm băm mà Python, PHP, Perl, Github (và ngăn chặn sự cố):

NodeJS đang băm đại diện UTF-8 của chuỗi. Các ngôn ngữ khác (như Python, PHP hoặc PERL ...) đang băm chuỗi byte.

Chúng ta có thể thêm đối số nhị phân để sử dụng chuỗi byte.

Mã số:

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

Tài liệu:

  • crypto.createHash (thuật toán [, tùy chọn]): Thuật toán phụ thuộc vào các thuật toán có sẵn được hỗ trợ bởi phiên bản OpenSSL trên nền tảng.
  • hash.digest ([mã hóa]): Mã hóa có thể là 'hex', 'latin1' hoặc 'base64'. (cơ sở 64 là ít lâu hơn).

Bạn có thể gặp sự cố với: sha256 ("\ xac"), "\ xd1", "\ xb9", "\ xe2", "\ xbb", "\ x93", v.v ...

  • Các ngôn ngữ khác (như PHP, Python, Perl ...) và giải pháp của tôi với .update(data, "binary"):

    sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47
  • Nodejs theo mặc định (không có nhị phân):

    sha1("\xac") //f50eb35d94f1d75480496e54f4b4a472a9148752

15

Các cryptomô-đun làm cho điều này rất dễ dàng.

Thiết lập:

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

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

Sử dụng:

sha256('Hello, world. ');

10

Tại đây, bạn có thể điểm chuẩn tất cả các giá trị băm được hỗ trợ trên phần cứng của bạn, được hỗ trợ bởi phiên bản node.js. Một số là mật mã, và một số chỉ dành cho tổng kiểm tra. Nó tính toán "Hello World" 1 triệu lần cho mỗi thuật toán. Có thể mất khoảng 1-15 giây cho mỗi thuật toán (Được thử nghiệm trên Công cụ tính toán tiêu chuẩn của Google với 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);  
}

Kết quả:
DSA: 1992ms
DSA-SHA: 1960ms
DSA-SHA1: 2062ms
DSA-SHA1 tuổi: 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-với-SHA1: 1880ms
MD4: 1833ms
md4WithRSAEncoding: 1925ms
md5: 1863ms
md5WithRSAEncoding: 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
xoáy nước: 2578ms


1
Các RSA-tiền tố làm gì?
balupton

6

Đơn giản một Liners:

Nếu bạn muốn băm văn bản UTF8:

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

Nếu bạn muốn có cùng hàm băm với Python, PHP, Perl, Github:

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

Bạn cũng có thể thay thế 'sha256'với 'sha1', 'md5', 'sha256','sha512'


1

Xem xét những suy nghĩ từ http: // www . Dùtcrime.org/blog/the-cryptographic-doom-principl/ (nói ngắn gọn: mã hóa FIRST, THEN xác thực. 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); 
    }
}

Nó có thể được thử nghiệm với:

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

Hi vọng điêu nay co ich :-)


1

Tôi sử dụng blueimp-md5 , "Tương thích với các môi trường phía máy chủ như Node.js, các trình tải mô-đun như RequireJS, Browserify hoặc webpack và tất cả các trình duyệt web."

Sử dụng nó như thế này:

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

var myHashedString = createHash('GreensterRox');

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

Nếu truyền các giá trị băm xung quanh trong mở, luôn luôn là một ý tưởng tốt để muối chúng để mọi người khó tái tạo chúng hơn:

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

Ngay cả khi hàm băm không để bảo mật, bạn có thể sử dụng sha thay vì md5. Theo tôi, mọi người nên quên đi md5 bây giờ, đó là quá khứ!

Các nútj bình thường sha256 không được dùng nữa. Vì vậy, bây giờ bạn có hai lựa chọn thay thế:

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

Tôi thích sử dụng shajsthay vì hash, vì tôi coi sha là hàm băm tốt nhất hiện nay và bây giờ bạn không cần một hàm băm khác. Vì vậy, để có được một số băm trong hex, bạn nên làm như sau:

sha256.update('hello').digest('hex')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.