HMAC鍵のハードコーディング

HMAC鍵のハードコーディング

説明

HMAC鍵をソースコードに埋め込むと、メッセージ認証に使う秘密鍵が露出します。ソースの取得、アプリケーションの逆コンパイル、リポジトリの閲覧などによって鍵を取得される可能性があります。その鍵を使ってメッセージやトークンを偽造され、HMACを信頼する制御を回避されるおそれがあります。

想定される影響

  • 取得された鍵で認証データを偽造され、不正アクセスにつながる可能性があります。
  • メッセージを変更し、正当なものに見える認証コードを生成されるおそれがあります。
  • 鍵に依存する認証やメッセージ完全性の保護が無効になる可能性があります。HMACはメッセージの内容を暗号化しません。

対処方法

  • 秘密鍵をソースコードに埋め込まず、環境変数や保護された設定から読み込んでください。
  • コードリポジトリに秘密値を保存しないでください。
  • ハードコードされた鍵は速やかに失効・交換してください。漏えいがあった場合は、関連ログを確認して不正利用の有無を調べてください。

例

変更前

javascript
const crypto = require('crypto');

const HMAC_KEY = 'abcd1234abcd1234abcd1234'; // ハードコードされた鍵

function makeHmac(data) {
  return crypto.createHmac('sha256', HMAC_KEY).update(data).digest('hex');
}

変更後

javascript
const crypto = require('crypto');

const HMAC_KEY = process.env.HMAC_KEY; // 環境変数から鍵を読み込む

function makeHmac(data) {
  if (!HMAC_KEY) {
    throw new Error('HMAC 키가 설정되지 않았습니다.');
  }
  return crypto.createHmac('sha256', HMAC_KEY).update(data).digest('hex');
}

解説:

  • 変更前: HMACの秘密鍵がコードに直接記述されているため、コードの漏えいとともに取得される可能性があります。
  • 変更後: 環境変数から鍵を読み込み、未設定なら処理を拒否します。環境変数の供給経路とアクセス権限も保護し、鍵をログへ記録しないでください。

参考資料