暗号学的な nonce を正しく生成する
nonce(number used once)は、同じ鍵での暗号化ごとに一意でなければなりません。ランダム nonce とカウンタ nonce の使い分けと、再利用がもたらす影響を学びましょう。
- 1
nonce は同じ鍵の下で決して繰り返してはなりません。2 つのアプローチがあります。(1) ランダム nonce — CSPRNG から 96 ビットを生成。96 ビット空間では衝突確率は無視できます。(2) カウンタ nonce — 単調なカウンタを維持。一意性は保証されますが、永続的な状態が必要です。ランダムはより単純で、カウンタは決定的です。
- 2 ランダムバイトジェネレーター →
96 ビット(12 バイト)のランダム nonce を生成します。これは AES-GCM の標準サイズです。96 ビットなら、2^32 回の暗号化後の衝突確率は 2^-32 未満(誕生日限界)で、ほとんどのアプリケーションで安全です。
- 3 ハッシュ計算ツール →
メッセージ識別子から決定的な nonce が必要な場合は、ハッシュを使います:nonce = H(message_id)。同じメッセージが同じ暗号文を生成する必要がある場合(決定的暗号)に便利ですが、2 つのメッセージが同一かどうかが露見する点に注意してください。
- 4
絶対に使ってはならないもの:タイムスタンプ(高速なマシンで重複し得る)、Math.random()(暗号学的でない)、ハードコードされた定数、折り返すカウンタ。特に AES-GCM では 96 ビット nonce が最適です。他のサイズは追加処理が必要で、セキュリティが弱まる場合があります。
よくある質問
- ランダム nonce とカウンタ nonce のどちらですか?
- ランダムはより単純でステートレスです。ほとんどのアプリケーションに使えます。カウンタは決定的で誕生日限界の問題を回避しますが、永続状態が必要で、カウンタがリセットされると(サーバー再起動など)失敗します。AES-GCM では、NIST は 96 ビットのランダム nonce を推奨しています。
- うっかり nonce を再利用してしまったら?
- GCM では nonce の再利用は壊滅的です。認証鍵が漏えいし、偽造が可能になります。CTR では、2 つの平文の XOR が漏れます。再利用が疑われる場合は、直ちに暗号鍵をローテーションし、すべてのデータを新しい nonce で再暗号化してください。
このタスクを解決するワークフロー
コンテンツのハッシュと Base64 エンコード
入力のハッシュを計算し、コンパクトな転送のためにハッシュダイジェストを Base64 としてエンコードする。 パイプライン
テキストのハッシュと整合性検証
入力テキストのハッシュを計算し、期待されるハッシュと比較して整合性を検証する。 パイプライン
テキストのハッシュと CRC32 チェックサム検証
データ整合性検証のために、暗号学的 SHA-256 ハッシュと CRC32 チェックサムの両方を計算する。 パイプライン
MD5 ハッシュ後に Base58 エンコード
MD5 ハッシュを計算し、コンパクトな表現のために Base58 としてエンコードする。 パイプライン
マルチハッシュ速度比較
入力をハッシュし、複数のハッシュアルゴリズムをベンチマークして速度と出力を比較する。 パイプライン
パスワード生成とハッシュ
ランダムパスワードを生成し、安全な保存のためにハッシュする。 パイプライン
SHA3-256 ハッシュと CRC32 チェックサム
SHA3-256 ハッシュを計算し、二重整合性検証のために CRC32 チェックサムを計算する。 パイプライン
SHA-512 ハッシュ後に Hex エンコード
SHA-512 ハッシュを計算し、可読性のために Hex としてエンコードする。 パイプライン
テキスト反転とハッシュ
テキストを反転し、その後反転結果の SHA-256 ハッシュを計算する。 パイプライン
テキストスクランブルとハッシュ
テキストをスクランブルし、その後スクランブル結果をハッシュする。 パイプライン
関連ツール
ランダムバイトジェネレーター
Generate cryptographically secure random bytes or integers。無料、プライベート、100%クライアントサイド。 ツール
ハッシュ計算ツール
Compute MD5, SHA-1, SHA-256, or SHA-512 hashes with hex or Base64 output。無料、プライベート、100%クライアントサイド。 ツール
AES 暗号化ツール
Encrypt text or binary data with AES (CBC/GCM/ECB) using Web Crypto API。無料、プライベート、100%クライアントサイド。 ツール