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