Tôi muốn tạo một hàm băm I love cupcakes
(đã ký với khóa abcdeg
)
Làm cách nào tôi có thể tạo băm đó, bằng cách sử dụng Node.js Crypto?
Tôi muốn tạo một hàm băm I love cupcakes
(đã ký với khóa abcdeg
)
Làm cách nào tôi có thể tạo băm đó, bằng cách sử dụng Node.js Crypto?
Câu trả lời:
Tài liệu về tiền điện tử: http://nodejs.org/api/crypto.html
const crypto = require('crypto')
const text = 'I love cupcakes'
const key = 'abcdeg'
crypto.createHmac('sha1', key)
.update(text)
.digest('hex')
crypto.timingSafeEqual(Buffer.from(a), Buffer.from(b))
: stackoverflow.com/questions/31095905/ trên
Một vài năm trước đây đã nói rằng update()
và digest()
là phương pháp kế thừa và phương pháp API phát trực tuyến mới đã được giới thiệu. Bây giờ các tài liệu nói rằng một trong hai phương pháp có thể được sử dụng. Ví dụ:
var crypto = require('crypto');
var text = 'I love cupcakes';
var secret = 'abcdeg'; //make this your secret!!
var algorithm = 'sha1'; //consider using sha256
var hash, hmac;
// Method 1 - Writing to a stream
hmac = crypto.createHmac(algorithm, secret);
hmac.write(text); // write in to the stream
hmac.end(); // can't read from the stream until you call end()
hash = hmac.read().toString('hex'); // read out hmac digest
console.log("Method 1: ", hash);
// Method 2 - Using update and digest:
hmac = crypto.createHmac(algorithm, secret);
hmac.update(text);
hash = hmac.digest('hex');
console.log("Method 2: ", hash);
Đã thử nghiệm trên nút v6.2.2 và v7.7.2
Xem https://nodejs.org/api/crypto.html#crypto_group_hmac . Cung cấp thêm ví dụ cho việc sử dụng phương pháp phát trực tuyến.
update
và không write
. Tôi bối rối, đó là thực hành tốt nhất bây giờ? Tôi không thể tìm thấy các tài nguyên nói điều đó rõ ràng như bạn đề cập đến nó.
digest
và update
đã không được chấp nhận và được đặc trưng trong các tài liệu hướng dẫn: nodejs.org/api/crypto.html#crypto_class_hmac . Tôi khuyên bạn chỉ nên sử dụng API luồng nếu bạn đang đọc từ một luồng.
Giải pháp của Gwerder sẽ không hoạt động vì hash = hmac.read();
xảy ra trước khi luồng được hoàn thành. Do đó, vấn đề của AngraX. Ngoài ra hmac.write
tuyên bố là không cần thiết trong ví dụ này.
Thay vào đó hãy làm điều này:
var crypto = require('crypto');
var hmac;
var algorithm = 'sha1';
var key = 'abcdeg';
var text = 'I love cupcakes';
var hash;
hmac = crypto.createHmac(algorithm, key);
// readout format:
hmac.setEncoding('hex');
//or also commonly: hmac.setEncoding('base64');
// callback is attached as listener to stream's finish event:
hmac.end(text, function () {
hash = hmac.read();
//...do something with the hash...
});
Chính thức hơn, nếu bạn muốn, dòng
hmac.end(text, function () {
có thể được viết
hmac.end(text, 'utf8', function () {
bởi vì trong ví dụ này văn bản là một chuỗi utf
It is a stream that is both readable and writable. The written data is used to compute the hmac. Once the writable side of the stream is ended, use the read() method to get the computed digest.
Bạn đọc nó khi ghi bên kết thúc , bạn không cần phải chờ đợi, ngay cả khi có thể đọc được bên trở nên dễ đọc (mặc dù nó chắc chắn không). Đọc tài liệu của bạn xin vui lòng.
hmac.end(...)
đã được gọi, " đã kết thúc " có nghĩa là luồng đã đưa ra sự kiện kết thúc của nó , đó là lý do tại sao lệnh chấp nhận gọi lại. Sau khi phương thức end () được gọi, luồng yêu cầu thời gian để xóa dữ liệu đến hệ thống cơ bản. Nếu bạn gọi read () trước khi sự kiện kết thúc được nêu ra, nó sẽ thất bại. Hãy tiếp tục và viết mã của Gwerder vào JSbin và tự mình xem. Bạn nên đọc tài liệu Streams để hiểu cách thức hoạt động của nó.
read()
khi bên có thể ghi được kết thúc, và không có gì về sự kiện kết thúc.