コンテンツへスキップ
uencoder

暗号学的な nonce を正しく生成する

nonce(number used once)は、同じ鍵での暗号化ごとに一意でなければなりません。ランダム nonce とカウンタ nonce の使い分けと、再利用がもたらす影響を学びましょう。

  1. 1

    nonce は同じ鍵の下で決して繰り返してはなりません。2 つのアプローチがあります。(1) ランダム nonce — CSPRNG から 96 ビットを生成。96 ビット空間では衝突確率は無視できます。(2) カウンタ nonce — 単調なカウンタを維持。一意性は保証されますが、永続的な状態が必要です。ランダムはより単純で、カウンタは決定的です。

  2. 2
    ランダムバイトジェネレーター →

    96 ビット(12 バイト)のランダム nonce を生成します。これは AES-GCM の標準サイズです。96 ビットなら、2^32 回の暗号化後の衝突確率は 2^-32 未満(誕生日限界)で、ほとんどのアプリケーションで安全です。

  3. 3
    ハッシュ計算ツール →

    メッセージ識別子から決定的な nonce が必要な場合は、ハッシュを使います:nonce = H(message_id)。同じメッセージが同じ暗号文を生成する必要がある場合(決定的暗号)に便利ですが、2 つのメッセージが同一かどうかが露見する点に注意してください。

  4. 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 ハッシュを計算する。
パイプライン
テキストスクランブルとハッシュ
テキストをスクランブルし、その後スクランブル結果をハッシュする。
パイプライン

関連ツール