Skip to content

Latest commit

 

History

History
309 lines (219 loc) · 24.6 KB

0x97-Appendix-V_Cryptography.md

File metadata and controls

309 lines (219 loc) · 24.6 KB

付録 V: 暗号化

V6 は単にベストプラクティスを定義するだけではありません。暗号の原則に対する理解を深め、より耐性のある最新のセキュリティ手法の採用を促進することを目的としています。この付録では、V6 で概説されている包括的な標準を保管するために、各要件に関する詳細な技術情報を提供します。

アルゴリズム (V6.2)

暗号パラメータの等価な強度

さまざまな暗号システムの相対的なセキュリティ強度は以下の表のとおりです (NIST SP 800-57 Part 1, p.71 より):

セキュリティ強度 対称鍵アルゴリズム 有限体暗号 (DSA, DH, MQV) 整数因数分解暗号 (RSA) 楕円曲線暗号 (ECDSA, EdDSA, DH, MQV)
<= 80 2TDEA L = 1024
N = 160
k = 1024 f = 160-223
112 3TDEA L = 2048
N = 224
k = 2048 f = 224-255
128 AES-128 L = 3072
N = 256
k = 3072 f = 256-383
192 AES-192 L = 7680
N = 384
k = 7680 f = 384-511
256 AES-256 L = 15360
N = 512
k = 15360 f = 512+

注: このセクションでは量子コンピュータが存在しないことを前提としています。そのようなコンピュータが存在する場合、最後の 3 列の推定値はもはや有効ではなくなります。

乱数値 (V6.3)

承認された RNG 方式とアルゴリズム

名称 バージョン/リファレンス 備考 L1 L2 L3
/dev/random Linux 4.8 以降 (2016 年 10 月)、iOS、Android、その他の Linux ベースの POSIX オペレーティングシステムにもあります。RFC7539 に基づいています。 ChaCha20 ストリームを利用します。iOS SecRandomCopyBytes および Android Secure Random にあり、それぞれに正しい設定が提供されています。
/dev/urandom ランダムデータを提供するための Linux カーネルの特殊ファイルです。 ハードウェアのランダム性から高性能のエントロピーソースを提供します。
AES-CTR-DRBG NIST SP800-90A BCRYPT_RNG_ALGORITHM で設定された Windows CNG API BCryptGenRandom などの一般的な実装で使用されます。
HMAC-DRBG NIST SP800-90A
Hash-DRBG NIST SP800-90A
getentropy() OpenBSDLinux glibc 2.25 以降macOS 10.12 以降 で利用可能です。 シンプルで最小限の API で、カーネルのエントロピーソースから安全なランダムバイトを直接提供します。より現代的であり、古い API に関連する落とし穴を回避します。

RBG で許可されていないハッシュ

以下は RBG に使用すべきではありません (SHOULD NOT) (NIST SP-800-57 Part 1 による):

ハッシュ関数 リファレンス
SHA3-224 FIPS 202
SHA-512/224 FIPS 180-4
SHA-224 FIPS 180-4
KMAC128 NIST SP 800-185

暗号アルゴリズム (V6.5)

承認された暗号

以下の暗号が承認されています:

対称鍵アルゴリズム リファレンス L1 L2 L3
AES-256 FIPS 197
Salsa20 Salsa 20 specification
XChaCha20
XSalsa20 Extending the Salsa20 nonce
ChaCha20 RFC 8439
AES-192 FIPS 197
AES-128 FIPS 197

許可されていない暗号

以下は、明示的に許可されていない 暗号のリストです。上記のリストにないものは、文書化された理由とともに承認されなければなりませんが、以下は明示的に禁止されており、使用してはなりません (MUST NOT):

対称鍵アルゴリズム
2TDEA
3TDEA (3DES)
IDEA
RC4
Blowfish
ARC4
DES

AES 暗号モード

現代の暗号はさまざまな目的でさまざまなモード、特に AES を使用しています。ここでは AES 暗号モードの要件について説明します。

一般的なユースケースで承認されている暗号モード

以下のモードは、その機能が暗号化されたデータ保存 (次のサブセクションを参照) である場合を除いて、承認されています:

AES 暗号モード 認証済み リファレンス L1 L2 L3
GCM Yes NIST SP 800-38D
CCM Yes NIST SP 800-38C
CCM-8 Yes RFC 6655
CBC* No NIST SP 800-38A

* すべての暗号化されたメッセージは認証されなければなりません。このため、CBC モードを使用する場合は必ず、メッセージを検証するためにハッシュ関数または MAC が関連付けられていなければなりません (MUST)。一般的に、これは Encrypt-Then-Hash 方式で適用されなければなりません (MUST) (ただし、TLS 1.2 では代わりに Hash-Then-Encrypt を使用します)。これが保証できない場合、CBC を使用してはいけません (MUST NOT)。

一般的なユースケースで承認されている推奨暗号モード

指定の承認されたブロックモードのうち、実装ではこのリストの暗号を優先順に使用すべきです (SHOULD):

AES 暗号モード リファレンス L1 L2 L3
GCM NIST SP 800-38D
CCM NIST SP 800-38C

データ保存 (ディスク上のブロック暗号) でのみ承認されている暗号モード

以下のディスクレベルブロック暗号モードが承認されており、優先順にリストされています:

AES ディスク暗号モード リファレンス L1 L2 L3
XTS NIST SP 800-38E
XEX Rogaway 2004
LRW Liskov, Rivest, and Wagner 2005

許可されていない暗号モード

以下の暗号モードはいかなるユースケースでも使用してはいけません (MUST NOT):

暗号モード
ECB
CFB
OFB
CTR

鍵ラッピング

暗号鍵ラップ (および対応する鍵アンラップ) は、追加の暗号メカニズムを使用して既存の鍵をカプセル化 (つまりラップ) し、転送中などに元の鍵が明らかに露出しないようにすることで、既存の鍵を保護する方法です。元の鍵を保護するために使用されるこの追加の鍵はラップ鍵と呼ばれます。

この操作は、信頼できないとみなされる場所で鍵を保護したい場合、あるいは信頼できないネットワーク上やアプリケーション内で機密鍵を送信したい場合に実行できます。 ただし、ラップ/アンラップ手順を実行する前に、元の鍵の性質 (アイデンティティや目的など) を理解することを真剣に検討すべきです。これは、セキュリティと、特に鍵の機能 (署名など) の監査証跡や適切な鍵の保存を含むコンプライアンスの点で、ソースとターゲットの両方のシステム/アプリケーションに影響を及ぼす可能性があります。

鍵ラッピングには、NIST SP 800-38F に従い、量子脅威に対する将来を見据えた対策を考慮して、AES-256 のみを使用しなければなりません (MUST)。AES を使用する暗号モードは優先順に以下のとおりです:

鍵ラッピング リファレンス L1 L2 L3
KW NIST SP 800-38F
KWP NIST SP 800-38F

AES-192 と AES-128 はユースケースで必要な場合に使用できます (MAY) が、その理由はエンティティの暗号インベントリに文書化されなければなりません (MUST)。

ハッシュ関数 (V6.6)

一般的なユースケースで承認されているハッシュ関数

以下のハッシュ関数は、デジタル署名、HMAC、鍵導出関数 (KDF)、ランダムビット生成 (RBG) などの一般的な暗号ユースケースでの使用が承認されています。これらの関数は強力な衝突耐性を提供し、高セキュリティアプリケーションに適しています。これらのアルゴリズムの一部は、適切な暗号鍵管理で使用すると攻撃に対する強力な耐性を提供するため、HMAC、KDF、RBG 機能でも承認されています。

ハッシュ関数 HMAC/KDF/RBG に適しているか? リファレンス L1 L2 L3
SHA3-512 Y FIPS 202
SHA-512 Y FIPS 180-4
SHA3-384 Y FIPS 202
SHA-384 Y FIPS 180-4
SHA3-256 Y FIPS 202
SHA-512/256 Y FIPS 180-4
SHA-256 Y FIPS 180-4
KMAC256 N NIST SP 800-185
KMAC128 N NIST SP 800-185
SHAKE256 Y FIPS 202
BLAKE2s Y
BLAKE2b Y
BLAKE3 Y

パスワード保存のために承認されているハッシュ関数

以下のハッシュ関数は安全なパスワード保存に特に推奨されています。これらの低速ハッシュアルゴリズムは、パスワードクラッキングの計算難易度を上げることで、ブルートフォース攻撃や辞書攻撃を軽減します。

ハッシュ関数 リファレンス 必要なパラメータセット L1 L2 L3
argon2 RFC 9106 Argon2ID: Memory Cost 19MB, Time Cost 2, Parallelism 1
scrypt RFC 7914 2^15 r = 8 p = 1
bcrypt -- At least 10 rounds.
PBKDF2_SHA512 NIST SP 800-132, FIPS 180-4 210,000 iterations
PBKDF2_SHA256 NIST SP 800-132, FIPS 180-4 600,000 iterations

許可されていないハッシュ関数

以下のハッシュ関数は、既知の弱点や脆弱性のため、新しいマテリアルを生成する暗号操作に使用してはいけません (MUST NOT)。既存のマテリアルの検証にのみ使用できます (MAY)。

ハッシュ関数 リファレンス
CRC (any length) --
MD4 RFC 1320
MD5 RFC 1321
SHA-1 RFC 3174 & RFC 6194

デジタル署名のために許可されていないハッシュ関数

デジタル署名の実装では、以下のハッシュ関数は衝突耐性が不十分なため使用してはいけません (MUST NOT)。

ハッシュ関数 リファレンス
SHA-224 FIPS 180-4
SHA-512/224 FIPS 180-4
SHA3-224 FIPS 202

鍵交換メカニズム (V6.7)

承認されている KEX スキーム

すべての鍵交換スキームに対して 112 ビット以上のセキュリティ強度が確保されていなければならず (MUST)、その実装は以下の表のパラメータ選択に従わなければなりません (MUST)。

スキーム ドメインパラメータ
RSA k >= 2048
Diffie-Hellman (DH) L >= 2048 & N >= 224
Elliptic Curve Diffie-Hellman (ECDH) f >= 224

ここでのパラメータは以下のとおりです:

  • k は RSA 鍵の鍵サイズです。
  • L は有限体暗号の公開鍵 (public key) のサイズであり、N は秘密鍵 (private key) のサイズです。
  • f は ECC の鍵サイズの範囲です。

承認されている DH グループ

以下のグループが承認されており、Diffie-Hellman KEX の実装に使用しなければなりません (MUST)。IKEv2 グループはリファレンスとして提供されています (NIST SP 800-77)。同等のグループが他のプロトコルで使用されるかもしれません。このリストは最も強力なものから最も弱いものの順に並べられています。セキュリティ強度は NIST SP 800-56A, Appendix D および NIST SP 800-57 Part 1 Rev.5 に記載されています。

グループ スキーム パラメータ セキュリティビット L1 L2 L3
21 ECC 521-bit random ECP group 260
32 ECC Curve448 224
18 MODP 8192-bit MODP Group 192 < 200
20 ECC 384-bit random ECP group 192
17 MODP 6144-bit MODP Group 128 < 176
16 MODP 4096-bit MODP Group 128 < 152
31 ECC Curve25519 128
19 ECC 256-bit random ECP group 128
15 MODP 3072-bit MODP Group 128
14 MODP 2048-bit MODP Group 112

許可されていない KEX スキーム

新しい実装では NIST SP 800-56A & B および NIST SP 800-77 に準拠していないスキームを使用してはいけません (MUST NOT)。

特に IKEv1 は本番環境で使用してはいけません (MUST NOT)。

メッセージ認証コード (MAC)

メッセージ認証コード (MAC) は、メッセージの完全性と真正性を検証するために使用される暗号構造です。MAC は、メッセージと共有鍵 (secret key) を入力として受け取り、固定サイズのタグ (MAC 値) を生成します。MAC は安全な通信プロトコル (TLS/SSL など) で広く使用され、パーティ間で交換されるメッセージが本物で無傷であることを確保します。

承認されている MAC アルゴリズム

以下の MAC アルゴリズムは、完全性と真正性の保証を提供することで、メッセージ保護に使用することが承認されています。実装では、メッセージのセキュリティを確保するために、認証された暗号モードまたは別途適用された HMAC のみを使用しなければなりません (MUST)。

MAC アルゴリズム リファレンス 一般的な使用に適しているか? L1 L2 L3
HMAC-SHA-256 RFC 2104 & FIPS 198-1
HMAC-SHA-384 RFC 2104 & FIPS 198-1
HMAC-SHA-512 RFC 2104 & FIPS 198-1
HMAC-SHA-1 RFC 2104 & FIPS 198-1
KMAC128 NIST SP 800-185
KMAC256 NIST SP 800-185
Blake3

SHA-1 は一般的に使用すべきではありませんが、HMAC-SHA-1 の使用は現時点では問題がないと考えられています (NIST SP 800-57)。

許可されていない MAC アルゴリズム

以下のアルゴリズムは、既知の脆弱性や不十分なセキュリティ強度のため、明示的に禁止されており、使用してはいけません (MUST NOT):

MAC アルゴリズム リファレンス
HMAC-MD5 RFC 1321

デジタル署名

承認されているデジタル署名アルゴリズム

以下のデジタル署名アルゴリズムは、データの真正性と完全性を確保するために使用することが承認されています。署名スキームは NIST SP 800-57 Part 1 に従って承認された鍵サイズとパラメータを使用しなければなりません (MUST):

署名アルゴリズム リファレンス 一般的な使用に適しているか? L1 L2 L3
EdDSA (Ed25519, Ed448) RFC 8032
XEdDSA (Curve25519, Curve448) XEdDSA
ECDSA (P-256, P-384, P-521) FIPS 186-4
RSA-RSSA-PSS RFC 8017

許可されていないデジタル署名アルゴリズム

以下のデジタル署名アルゴリズムは、既知の弱点や不十分なセキュリティ強度のため、使用してはいけません (MUST NOT):

署名アルゴリズム リファレンス
RSA-SSA-PKCS#1 v1.5 RFC 8017
DSA (any key size) FIPS 186-4

鍵導出関数 (KDF)

承認されている KDF

鍵導出関数は鍵マテリアルを特定の暗号操作に適した鍵に変換します。以下の KDF が承認されており、アプリケーションのニーズとセキュリティコンテキストに基づいて使用されなければなりません (MUST):

KDF リファレンス 一般的な使用に適しているか? L1 L2 L3
argon2id RFC 9106
scrypt RFC 7914
PBKDF2 RFC 8018 & NIST SP 800-132
HKDF RFC 5869

許可されていない KDF

以下の KDF は、不十分なセキュリティプロパティや既知の弱点のため、明示的に禁止されており、使用してはいけません (MUST NOT):

KDF リファレンス
MD5-based KDFs RFC 1321
SHA-1-based KDFs RFC 3174 & RFC 6194

ポスト量子暗号標準

PQC 実装は FIPS-203/204/205 に準拠していなければなりませんが、堅牢化されたコードや実装リファレンスはまだ存在しません。 https://www.nist.gov/news-events/news/2024/08/nist-releases-first-3-finalized-post-quantum-encryption-standards