短すぎるRSA鍵長

短すぎるRSA鍵長

説明

RSA鍵が短すぎると、長期的な機密性や署名の保護に必要な安全余裕を確保できません。1024ビットRSAは、新しいシステムに十分な強度とはみなされません。ただし、すべての1024ビット鍵を短時間で復元できるという意味ではありません。攻撃のコストは、鍵長、使用環境、攻撃者のリソースによって異なります。

想定される影響

  • 秘密鍵が復元されると、その鍵で保護したデータの復号や署名の偽造が可能になるおそれがあります。
  • 長期保存する暗号文や信頼関係が、鍵の安全な使用期間を超えてリスクにさらされる場合があります。
  • 短い鍵を許可する互換設定により、組織の暗号ポリシーを満たせない可能性があります。

対処方法

  • 新しいRSA鍵は最低2048ビットで生成し、保護期間と要件に応じて3072ビット以上を検討してください。
  • 鍵生成時に最小長を適用し、ライブラリとサービスの要件を確認してください。
  • 既存の短い鍵は、証明書、署名の検証側、暗号文との依存関係を確認してから交換してください。既存データの復号に必要な鍵を、移行計画なしで削除しないでください。
  • 1024ビットを許可する旧来の互換設定も確認してください。

例

変更前

go
package main

import (
    "crypto/rand"
    "crypto/rsa"
    "log"
)

// 変更前: 1024ビットRSA鍵を生成
func generateWeakRSAKey() *rsa.PrivateKey {
    // 1024ビットは新しいセキュリティ設計には不十分
    keySize := 1024

    priv, err := rsa.GenerateKey(rand.Reader, keySize)
    if err != nil {
        log.Fatalf("failed to generate RSA key: %v", err)
    }
    return priv
}

func main() {
    _ = generateWeakRSAKey()
}

変更後

go
package main

import (
    "crypto/rand"
    "crypto/rsa"
    "log"
)

const (
    // 推奨する最小長: 2048ビット
    MinRSAKeySize = 2048
)

// 変更後: 2048ビット以上のRSA鍵を生成
func generateStrongRSAKey() *rsa.PrivateKey {
    keySize := MinRSAKeySize

    priv, err := rsa.GenerateKey(rand.Reader, keySize)
    if err != nil {
        log.Fatalf("failed to generate RSA key: %v", err)
    }
    return priv
}

func main() {
    _ = generateStrongRSAKey()
}

解説:

  • 変更前: generateWeakRSAKey は1024ビットの鍵を生成します。新しいセキュリティ設計には十分な安全余裕を提供しない長さです。
  • 変更後: MinRSAKeySize を2048に固定します。乱数生成、秘密鍵の保存、適切な署名・暗号化方式も別途管理する必要があります。

参考資料