ฉันต้องการสร้างแฮชของI love cupcakes
(ลงชื่อด้วยกุญแจabcdeg
)
ฉันจะสร้างแฮชนั้นได้อย่างไรโดยใช้ Node.js Crypto
ฉันต้องการสร้างแฮชของI love cupcakes
(ลงชื่อด้วยกุญแจabcdeg
)
ฉันจะสร้างแฮชนั้นได้อย่างไรโดยใช้ Node.js Crypto
คำตอบ:
เอกสารสำหรับ crypto: 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/ …
ไม่กี่ปีที่ผ่านมามันก็บอกว่าupdate()
และdigest()
เป็นวิธีการดั้งเดิมและวิธีการสตรีมมิ่งใหม่ API ได้รับการแนะนำ ตอนนี้เอกสารบอกว่าสามารถใช้วิธีใดวิธีหนึ่งได้ ตัวอย่างเช่น:
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);
ทดสอบบนโหนด v6.2.2 และ v7.7.2
ดูhttps://nodejs.org/api/crypto.html#crypto_class_hmac ให้ตัวอย่างเพิ่มเติมสำหรับการใช้วิธีการสตรีม
update
write
ฉันสับสนซึ่งเป็นแนวปฏิบัติที่ดีที่สุดในตอนนี้ ฉันไม่สามารถหาทรัพยากรที่บอกได้อย่างชัดเจนว่าคุณพูดถึงมัน
digest
และupdate
มีไม่ได้รับการคัดค้านและมีความสำคัญในเอกสาร: nodejs.org/api/crypto.html#crypto_class_hmac ฉันขอแนะนำให้ใช้สตรีม API เฉพาะเมื่อคุณอ่านจากสตรีมเท่านั้น
วิธีการแก้ปัญหาของ Gwerder จะไม่ทำงานเพราะhash = hmac.read();
เกิดขึ้นก่อนที่กระแสข้อมูลจะสิ้นสุด ดังนั้นปัญหาของ AngraX รวมถึงhmac.write
คำสั่งที่ไม่จำเป็นในตัวอย่างนี้
ทำสิ่งนี้แทน:
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...
});
เป็นทางการมากขึ้นถ้าคุณต้องการเส้น
hmac.end(text, function () {
สามารถเขียนได้
hmac.end(text, 'utf8', function () {
เพราะในตัวอย่างข้อความนี้เป็นสตริง 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.
คุณอ่านมันเมื่อเขียนได้ด้านสิ้นสุดวันที่คุณไม่จำเป็นต้องรอให้แม้กระทั่งเมื่ออ่านด้านกลายเป็นที่อ่านได้ ( แต่มันก็ไม่) โปรดอ่านเอกสารของคุณ
hmac.end(...)
ได้รับการเรียกว่า " สิ้นสุดแล้ว " หมายความว่าสตรีมได้เพิ่มเหตุการณ์เสร็จสิ้นซึ่งเป็นสาเหตุที่คำสั่งยอมรับการโทรกลับ หลังจากเรียกใช้เมธอด end () สตรีมจะต้องใช้เวลาในการล้างข้อมูลไปยังระบบที่เกี่ยวข้อง หากคุณโทร read () ก่อนที่เหตุการณ์จะเสร็จสิ้นการยกเหตุการณ์จะล้มเหลว ไปข้างหน้าและวางโค้ดของ Gwerder ลงใน JSbin และดูด้วยตัวคุณเอง คุณควรอ่านเอกสารStreamsเพื่อทำความเข้าใจว่ามันทำงานอย่างไร
read()
เมื่อสิ้นสุดการเขียนได้และไม่มีอะไรเกี่ยวกับเหตุการณ์เสร็จสิ้น