Bir I love cupcakes
anahtar oluşturmak istiyorum (anahtarla imzalanmış abcdeg
)
Bu karmayı Node.js Kripto kullanarak nasıl oluşturabilirim?
Bir I love cupcakes
anahtar oluşturmak istiyorum (anahtarla imzalanmış abcdeg
)
Bu karmayı Node.js Kripto kullanarak nasıl oluşturabilirim?
Yanıtlar:
Kripto belgeleri: 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/…
Birkaç yıl bu söyleniyordu önce update()
ve digest()
eski yöntemleri ve yeni akış API yaklaşımı tanıtıldı idi. Şimdi dokümanlar her iki yöntemin de kullanılabileceğini söylüyor. Örneğin:
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 ve v7.7.2 düğümünde test edildi
Bkz. Https://nodejs.org/api/crypto.html#crypto_class_hmac . Akış yaklaşımını kullanmak için daha fazla örnek verir.
update
değil write
. Kafam karıştı, hangisi şimdi en iyi uygulama? Söylediğin kadar net bir şekilde anlatacak kaynakları bulamıyorum.
digest
ve update
sahip değil kaldırıldı ve belgelerde yer veriliyor: nodejs.org/api/crypto.html#crypto_class_hmac . Akış API'sını yalnızca bir akıştan okuyorsanız kullanmanızı öneririm.
Gwerder'ın çözümü işe yaramaz çünkü hash = hmac.read();
akış tamamlanmadan önce olur. Böylece AngraX sorunları. Ayrıcahmac.write
bu örnekte ifade gerekli değildir.
Bunun yerine şunu yapın:
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...
});
Daha resmi olarak, isterseniz, çizgi
hmac.end(text, function () {
yazılabilir
hmac.end(text, 'utf8', function () {
çünkü bu örnekte metin bir utf dizesidir
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.
okudunuz , okunabilir tarafın okunabilir hale gelmesini beklemenize gerek yoktur (kesinlikle olsa da). Lütfen belgelerinizi okuyun.
hmac.end(...)
adı olmuştur, " sona akışı olduğu anlamına gelir" onun bitiş olayını kaldırdı komutu bir geri arama kabul yüzden. End () yöntemi çağrıldıktan sonra akış, verileri temel sisteme akıtmak için zaman gerektirir. Finish olayı yükseltilmeden önce read () öğesini çağırırsanız başarısız olur. Devam edin ve Gwerder'ın kodunu JSbin'e yapıştırın ve kendiniz görün. Nasıl çalıştığını anlamak için Akış belgelerini okumalısınız .
read()
, yazılabilir taraf sona erdiğinde kişinin kullanabileceği açıkça belirtilir ve bitiş olayıyla ilgili hiçbir şey yoktur.