説明
必要な安全性に対して鍵が短いと、総当たりやアルゴリズム固有の攻撃に対する余裕が小さくなります。RSAの素因数分解、楕円曲線の離散対数問題、共通鍵の探索では安全性の評価基準が異なるため、ビット数だけを直接比較できません。実際の攻撃コストは、アルゴリズム、鍵長、実装、必要な保護期間によって変わります。
想定される影響
- 鍵が復元されると、暗号化データの機密性や署名への信頼が損なわれる可能性があります。
- 長期間保護するデータは、計算能力の向上に伴って危険性が増す場合があります。
- 組織や適用規格が求める最低限の安全性を満たせない可能性があります。
対処方法
- 保護期間に合うアルゴリズムと鍵長を選んでください。一般的な目安としてRSAは2048ビット以上とし、長期保護には3072ビット以上を検討します。ECでは
secp256r1など、検証された曲線を使用してください。 - AESが対応する鍵長は128、192、256ビットです。必要な安全性に応じて選んでください。64ビットのAES鍵は、弱い有効な鍵ではなく、対応していない設定です。
KeyPairGeneratorやKeyGeneratorでは、確認済みの鍵長・曲線と安全な乱数生成器を指定してください。構成から読み込む値にも最低基準を適用します。- 鍵の交換時は、既存の暗号文、証明書、署名検証との互換性を計画してください。十分な鍵長でも、安全な暗号モード、鍵の保管、アクセス制御は別途必要です。
例
変更前
java
import java.security.KeyPairGenerator;
public class WeakKeyExample {
public static void main(String[] args) throws Exception {
// RSA 1024ビット: 基準を下回る
KeyPairGenerator rsa = KeyPairGenerator.getInstance("RSA");
rsa.initialize(1024); // BAD: 基準の2048ビット未満
rsa.generateKeyPair();
}
}
変更後
java
import javax.crypto.KeyGenerator;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.spec.ECGenParameterSpec;
public class StrongKeyExample {
public static void main(String[] args) throws Exception {
SecureRandom rnd = SecureRandom.getInstanceStrong();
// RSA 3072ビット: 基準の2048ビット以上
KeyPairGenerator rsa = KeyPairGenerator.getInstance("RSA");
rsa.initialize(3072, rnd);
rsa.generateKeyPair();
// 検証された256ビットのEC曲線を指定
KeyPairGenerator ec = KeyPairGenerator.getInstance("EC");
ec.initialize(new ECGenParameterSpec("secp256r1"), rnd);
ec.generateKeyPair();
// AESの256ビット鍵
KeyGenerator aes = KeyGenerator.getInstance("AES");
aes.init(256, rnd);
aes.generateKey();
}
}
変更前はRSA 1024ビットの鍵を生成します。変更後はRSA 3072ビット、ECのsecp256r1、AES 256ビットを指定します。実際の選択は、システムの安全性と互換性の要件に合わせて検討してください。