コンテンツへスキップ
uencoder

暗号鍵を安全に保管する

鍵をハードコードしたりソース管理にコミットしたりしてはいけません。HSM、KMS、エンベロープ暗号化、鍵導出パターンによる安全な鍵保管を学びましょう。

  1. 1

    黄金律:暗号鍵を、その鍵で暗号化するデータと同じ場所に平文で保存しないこと。セキュリティの高い順の選択肢:HSM(ハードウェア)、KMS(クラウドサービス)、エンベロープ暗号化(マスターキーでデータキーをラップ)、鍵導出(パスワード/パスフレーズから導出)。

  2. 2
    PBKDF2 鍵導出 →

    PBKDF2 と高い反復回数(100,000 以上)で、ユーザーパスワードから暗号鍵を導出します。ソルトはランダムで、別々に保存しなければなりません。これは、サーバー側の保存がない、ユーザー管理の鍵向けです。

  3. 3
    bcrypt ハッシュ生成 →

    認証のためにマスターパスワードを bcrypt でハッシュします。注意:bcrypt の出力は暗号鍵としてそのまま使えません。鍵導出には PBKDF2/scrypt を、パスワード検証には bcrypt を使ってください。

  4. 4
    AES 暗号化ツール →

    導出した鍵でデータを暗号化します。鍵が平文でディスクに触れることはありません。暗号化操作中にのみメモリ上に存在し、その後ゼロ化されます。

  5. 5

    サーバー側アプリケーションでは、KMS(AWS KMS、GCP KMS、Azure Key Vault)または HSM を使ってください。マスターキーはハードウェアの外に出ません。暗号化/復号は API を呼び出します。クライアント側では、強力な KDF でユーザーパスワードから鍵を導出し、ソルトだけを保存してください。

よくある質問

鍵を環境変数に保存できますか?
環境変数はハードコーディングよりましですが、プロセスにアクセスできる人には依然見えます(Linux の /proc/pid/environ など)。本番では KMS かシークレットマネージャー(Vault、AWS Secrets Manager)を使ってください。環境変数が許容されるのは開発だけです。
PBKDF2 と bcrypt の違いは何ですか?
PBKDF2 は任意の長さの鍵を生成する KDF です。暗号鍵に使ってください。bcrypt は固定長出力のパスワードハッシュ関数です。パスワード検証に使ってください。目的が異なり、互換性はありません。

このタスクを解決するワークフロー

関連ツール