I love cupcakes
(キーで署名されたabcdeg
)のハッシュを作成したい
Node.js暗号を使用してそのハッシュを作成するにはどうすればよいですか?
I love cupcakes
(キーで署名されたabcdeg
)のハッシュを作成したい
Node.js暗号を使用してそのハッシュを作成するにはどうすればよいですか?
回答:
暗号のドキュメント: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を使用することをお勧めします。
グワーダーのソリューション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()
、書き込み可能な側が終了したときにユーザーが使用できることが明示されており、終了イベントについては何もありません。