Answers:
加密文档: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
and 的用法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 ”表示流已引发其finish事件,这就是命令接受回调的原因。调用end()方法后,流需要时间才能将数据刷新到基础系统。如果在引发finish事件之前调用read(),它将失败。继续,将Gwerder的代码粘贴到JSbin中,亲自看看。您应该阅读Streams文档以了解其工作原理。
read()
当可写面结束时,人可以使用,并且与完成事件无关。