Saya ingin membuat hash I love cupcakes
(ditandatangani dengan kunci abcdeg
)
Bagaimana saya bisa membuat hash itu, menggunakan Node.js Crypto?
Saya ingin membuat hash I love cupcakes
(ditandatangani dengan kunci abcdeg
)
Bagaimana saya bisa membuat hash itu, menggunakan Node.js Crypto?
Jawaban:
Dokumentasi untuk 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/…
Beberapa tahun yang lalu dikatakan bahwa update()
dan digest()
adalah metode warisan dan pendekatan Streaming API baru diperkenalkan. Sekarang dokumen mengatakan bahwa salah satu metode dapat digunakan. Sebagai contoh:
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);
Diuji pada simpul v6.2.2 dan v7.7.2
Lihat https://nodejs.org/api/crypto.html#crypto_class_hmac . Memberikan lebih banyak contoh untuk menggunakan pendekatan streaming.
update
dan bukan write
. Saya bingung, praktik mana yang terbaik sekarang? Saya tidak dapat menemukan sumber daya yang mengatakannya sejelas yang Anda sebutkan.
digest
dan update
telah tidak dipakai lagi dan ditampilkan dalam dokumentasi: nodejs.org/api/crypto.html#crypto_class_hmac . Saya sarankan menggunakan API aliran hanya jika Anda membaca dari aliran.
Solusi Gwerder tidak akan berfungsi karena hash = hmac.read();
terjadi sebelum aliran selesai diselesaikan. Demikianlah masalah AngraX. Juga hmac.write
pernyataan adalah un-diperlukan dalam contoh ini.
Alih-alih lakukan ini:
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...
});
Lebih formal, jika Anda mau, garis
hmac.end(text, function () {
dapat ditulis
hmac.end(text, 'utf8', function () {
karena dalam contoh ini teks adalah string 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.
Anda membacanya ketika ditulis sisi berakhir , Anda tidak perlu bahkan menunggu ketika dibaca sisi menjadi dibaca (meskipun itu pasti tidak). Baca dokumentasi Anda.
hmac.end(...)
telah dipanggil, " berakhir " berarti bahwa aliran telah meningkatkan acara selesai , itulah sebabnya perintah menerima panggilan balik. Setelah metode end () dipanggil, aliran membutuhkan waktu untuk menyiram data ke sistem yang mendasarinya. Jika Anda memanggil read () sebelum acara selesai dimunculkan, itu akan gagal. Bagikan kode Gwerder ke JSbin dan lihat sendiri. Anda harus membaca dokumentasi Streams untuk memahami cara kerjanya.
read()
ketika sisi yang dapat ditulis berakhir, dan tidak ada apa-apa tentang acara selesai.