暗号鍵を安全に保管する
鍵をハードコードしたりソース管理にコミットしたりしてはいけません。HSM、KMS、エンベロープ暗号化、鍵導出パターンによる安全な鍵保管を学びましょう。
- 1
黄金律:暗号鍵を、その鍵で暗号化するデータと同じ場所に平文で保存しないこと。セキュリティの高い順の選択肢:HSM(ハードウェア)、KMS(クラウドサービス)、エンベロープ暗号化(マスターキーでデータキーをラップ)、鍵導出(パスワード/パスフレーズから導出)。
- 2 PBKDF2 鍵導出 →
PBKDF2 と高い反復回数(100,000 以上)で、ユーザーパスワードから暗号鍵を導出します。ソルトはランダムで、別々に保存しなければなりません。これは、サーバー側の保存がない、ユーザー管理の鍵向けです。
- 3 bcrypt ハッシュ生成 →
認証のためにマスターパスワードを bcrypt でハッシュします。注意:bcrypt の出力は暗号鍵としてそのまま使えません。鍵導出には PBKDF2/scrypt を、パスワード検証には bcrypt を使ってください。
- 4 AES 暗号化ツール →
導出した鍵でデータを暗号化します。鍵が平文でディスクに触れることはありません。暗号化操作中にのみメモリ上に存在し、その後ゼロ化されます。
- 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 は固定長出力のパスワードハッシュ関数です。パスワード検証に使ってください。目的が異なり、互換性はありません。
このタスクを解決するワークフロー
関連ツール
PBKDF2 鍵導出
Derive a key from a password using PBKDF2 (RFC 2898) with Web Crypto API。無料、プライベート、100%クライアントサイド。 ツール
bcrypt ハッシュ生成
Hash passwords with bcrypt or verify bcrypt hashes。無料、プライベート、100%クライアントサイド。 ツール
AES 暗号化ツール
Encrypt text or binary data with AES (CBC/GCM/ECB) using Web Crypto API。無料、プライベート、100%クライアントサイド。 ツール