【エンジニア必見】Node.jsのCryptoモジュールでHMAC-SHA1ハッシュを操る

2024-05-14

Node.js Crypto を使って HMAC-SHA1 ハッシュを作成する方法

HMAC-SHA1 ハッシュは、メッセージの改ざん防止やデータの整合性を検証するために使用される暗号化ハッシュ関数です。 Node.js の crypto モジュールを使用して、HMAC-SHA1 ハッシュを簡単に作成できます。

手順

  1. 必要なモジュールをインポートする
const crypto = require('crypto');
  1. HMAC オブジェクトを作成する
const key = 'mySecretKey'; // シークレットキーを設定
const message = 'This is my message'; // ハッシュ化するメッセージを設定
const hmac = crypto.createHmac('sha1', key);
  1. メッセージを更新する
hmac.update(message);
  1. ハッシュを生成する
const digest = hmac.digest('hex');
console.log(digest); // ハッシュ値を出力

const crypto = require('crypto');

const key = 'mySecretKey';
const message = 'This is my message';

const hmac = crypto.createHmac('sha1', key);
hmac.update(message);
const digest = hmac.digest('hex');
console.log(digest); // => 91a9045c46213df6767cb4973d0c17fd834921a2

ポイント

  • HMAC-SHA1 ハッシュは、メッセージ認証コード (MAC) として使用できます。 MAC は、メッセージが送信者によって送信されたことを検証し、改ざんされていないことを確認するために使用されます。
  • HMAC-SHA1 ハッシュは、パスワードのハッシュ化にも使用できます。 ただし、パスワードのハッシュ化には、より安全なアルゴリズム ( bcrypt または scrypt など) を使用する方が一般的です。
  • シークレットキーは安全に保管する必要があります。 シークレットキーが漏洩すると、攻撃者がハッシュを偽造したり、メッセージを改ざんしたりすることができます。
  • このコードは、Node.js バージョン 8.0 以降で動作します。
  • より複雑なシナリオについては、Node.js Crypto モジュールのドキュメントを参照してください。



Node.js Crypto を使って HMAC-SHA1 ハッシュを作成するサンプルコード

const crypto = require('crypto');

const key = 'mySecretKey'; // シークレットキーを設定
const message = 'This is my message'; // ハッシュ化するメッセージを設定

const hmac = crypto.createHmac('sha1', key);
hmac.update(message);
const digest = hmac.digest('hex');
console.log(digest); // ハッシュ値を出力

このコードを実行すると、以下の出力が得られます。

91a9045c46213df6767cb4973d0c17fd834921a2

説明

const crypto = require('crypto');

この行は、crypto モジュールをインポートします。 このモジュールは、暗号化操作に使用されるさまざまな機能を提供します。

const key = 'mySecretKey';
const message = 'This is my message';

const hmac = crypto.createHmac('sha1', key);

このコードブロックは、以下の操作を行います。

  • key 変数に格納されているシークレットキーを使用して、HMAC オブジェクトを作成します。
  • message 変数に格納されているメッセージを、HMAC オブジェクトに設定します。
hmac.update(message);

この行は、HMAC オブジェクトにメッセージを更新します。

const digest = hmac.digest('hex');
console.log(digest);
  • HMAC オブジェクトを使用して、メッセージのハッシュを生成します。
  • ハッシュを 16 進数表記に変換し、digest 変数に格納します。
  • digest 変数の値をコンソールに出力します。



Node.js で HMAC-SHA1 ハッシュを作成するその他の方法

crypto.subtle モジュールは、WebAssembly を使用して暗号化操作をハードウェアで高速化するために設計されています。 HMAC-SHA1 ハッシュを作成するには、以下の手順を実行できます。

const crypto = require('crypto');
const { subtle } = crypto;

const key = new TextEncoder().encode('mySecretKey'); // シークレットキーを Uint8Array に変換
const message = new TextEncoder().encode('This is my message'); // メッセージを Uint8Array に変換

async function generateHash() {
  const algorithm = { name: 'HMAC', hash: 'SHA-1' };
  const keyBuffer = await subtle.importKey('raw', key, algorithm);
  const digestBuffer = await subtle.sign(keyBuffer, message);
  const digest = new TextDecoder().decode(digestBuffer);
  console.log(digest); // ハッシュ値を出力
}

generateHash();

外部ライブラリを使用する

Node.js には、HMAC-SHA1 ハッシュの作成を容易にするさまざまな外部ライブラリが用意されています。 人気のあるライブラリの 1 つは crypto-js です。 以下の手順でインストールして使用できます。

npm install crypto-js

ライブラリをインストールしたら、以下のコードを使用して HMAC-SHA1 ハッシュを作成できます。

const CryptoJS = require('crypto-js');

const key = 'mySecretKey';
const message = 'This is my message';

const hash = CryptoJS.HMAC(CryptoJS.SHA1, message, key);
const digest = hash.toString(CryptoJS.enc.Hex);
console.log(digest); // ハッシュ値を出力

それぞれの方法の比較

  • crypto モジュール: これは、Node.js の標準ライブラリに含まれているため、追加のインストールが不要です。 ただし、crypto.subtle モジュールほど高速ではありません。
  • crypto.subtle モジュール: このモジュールは、ハードウェア アクセラレーションを使用して HMAC-SHA1 ハッシュを高速に作成できます。 ただし、すべてのブラウザでサポートされているわけではありません。
  • 外部ライブラリ: 外部ライブラリは、追加機能や使いやすさを提供する場合があります。 ただし、プロジェクトに追加の依存関係を追加する必要があります。

どの方法を使用するかは、特定のニーズと要件によって異なります。 パフォーマンスが重要な場合は、crypto.subtle モジュールを使用するのが最良の方法です。 シンプルさと使いやすさを重視する場合は、crypto モジュールまたは外部ライブラリを使用することを検討してください。


javascript node.js algorithm


JavaScript: blur イベントと event.relatedTarget プロパティでフォーカス移動先の要素を取得する

この解説では、JavaScript の blur イベントと、フォーカスが移動した先の要素を取得する方法について詳しく説明します。blur イベントは、ユーザーが要素からフォーカスを外したときに発生します。これは、ユーザーが別の要素をクリックしたり、タブキーで別の要素に移動したり、ページ外をクリックしたりする場合に発生します。...


JavaScriptのpreventDefault()メソッドを使ってボタンの送信を阻止する方法

HTMLのbutton要素には、type属性があります。この属性の値をsubmit以外に設定することで、ボタンのデフォルト動作を変更できます。type="button": ボタンをクリックしても何も起こりません。type="reset": フォーム内のすべてのフィールドを初期値に戻します。...


JavaScriptで配列を名前(アルファベット順)でソートするサンプルコード

Array. prototype. sort()メソッドは、配列内の要素をソートするために使用されます。このメソッドは、デフォルトで要素を昇順にソートしますが、比較関数を渡すことで降順にソートしたり、他の条件に基づいてソートしたりすることもできます。...


【徹底解説】 Node.js × TypeScript でのモジュール読み込み: require と ESM の違い

CommonJS:これは Node. js の伝統的なモジュールシステムです。ES Modules (ESM):これは JavaScript と TypeScript の新しいモジュールシステムです。新しいプロジェクトの場合は、ESM を使用することをお勧めします。...