Bir HMAC-SHA1 karması oluşturmak için Node.js Kripto parasını nasıl kullanabilirim?


Yanıtlar:


369

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')

'hex' her zaman gerekli değildir, örneğin yakutun hmac digest eşdeğerini yapmak için.
htafoya

6
Bir karma değerini doğrulamak için şunları kullanmalısınız crypto.timingSafeEqual(Buffer.from(a), Buffer.from(b)): stackoverflow.com/questions/31095905/…
baptx


98

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.


Tek hat değil ve aramalar zincirleme yapılamaz ... ama bu yaklaşımı kullanacağım.
tfmontague

2
Hayatım boyunca bu işi yapamam. hmac.read () bir "[object SlowBuffer]" döndürür ve hmac.read () kullanarak içeriği okumaya çalışırsam toString ('hex'); Beklenen değeri alamıyorum. Güncelleme / özetin kullanımdan kaldırılması yaklaşımını kullanırsam, beklenen dizeyi döndürür. Bunu üçüncü taraf POST'tan sunucularıma bir imzayı doğrulamak için kullanıyorum. Ne olduğuna dair herhangi bir fikir var mı?
AngraX

Belki de hmac.read, veri akışa akıtmadan önce oluyor? Belki de hmac.read akımın bitiş etkinliği tarafından yönlendirilmelidir?
Dave

Aslında yayınlanmıştır bağlantı explicitely kullanımından söz updatedeğil write. Kafam karıştı, hangisi şimdi en iyi uygulama? Söylediğin kadar net bir şekilde anlatacak kaynakları bulamıyorum.
SCBuergel.eth

5
Kasım 2016 tarihi itibariyle digestve updatesahip 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.
Ricardo Tomasi

22

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


Yanılıyorsunuz, geri arama eklemenize gerek yok. Bu akış zaman uyumludur ve end () çağrıldıktan hemen sonra okunabilir. En büyüleyici şey, resmi belgelerde yazılmış olması, ancak herkesin 5 (bükülmüş) sentini koyması gerekiyor.
stroncium

Trollüyor musun? Belki de belgeleri okumalısınız. Eğer bitirme olayından önce akışı okumaya çalışırsanız başarısız olur.
Dave

1
[ Nodejs.org/api/crypto.html#crypto_class_hmac] Yazılabilir taraf sona erdiğindeIt 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.
Strongcium

createHmac bir akış oluşturur . " Sona erdi ortalama gelmez Yukarıdaki alıntı dokümantasyon satırına" 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 .
Dave

Bir süredir üretim kodunda kullandım ve cehennem kadar kararlı. Dürüst JSBin ne olduğunu bilmiyorum, ama aynı zamanda sadece kopyala-yapıştır ile nodejs desteklenen kodu denedim ve çok çalışıyor. Dokümantasyon için ek anlamlar hayal etmemelisiniz. "sona erdi" her zaman belgelerin her yerinde "sona erdi" anlamına gelir. Yine, akışın 2 tarafı olduğunu yanlış anlıyor gibisiniz. Ve dokümantasyonda read(), yazılabilir taraf sona erdiğinde kişinin kullanabileceği açıkça belirtilir ve bitiş olayıyla ilgili hiçbir şey yoktur.
Strongcium
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.