Swiftの固定された初期化ベクトルの使用

固定された初期化ベクトル(IV)の使用

説明

同じ鍵でIVやnonceを再利用すると、CBCでは平文の先頭部分の繰り返しがわかる場合があり、CTRやGCMでは異なるメッセージの機密性が損なわれるおそれがあります。GCMでは認証タグによる保護も弱まります。

想定される影響

  • 平文の繰り返しパターンの露出
  • 暗号文を分析される可能性の増大
  • 同じ鍵を使うデータの復元リスクの増大やGCMの認証保護の低下

対処方法

  1. 暗号化のたびに、暗号学的に安全な乱数でIVやnonceを生成します。
  2. IVやnonceを秘密にする必要はありませんが、同じ鍵では再利用しないでください。
  3. CryptoKitのAES-GCMなど、nonceの生成を処理するAPIを優先します。

例

変更前

swift
let aes = try AES(
    key: key,
    blockMode: CBC(iv: Array<UInt8>(repeating: 0, count: AES.blockSize)))

変更後

swift
import Foundation
import CryptoKit

func encryptWithFreshNonce(
    data: Data,
    key: SymmetricKey
) throws -> AES.GCM.SealedBox {
    return try AES.GCM.seal(data, using: key)
}

説明:

  • 変更前: IVが固定されているため、同じ入力が繰り返されると暗号文同士の関係がわかるおそれがあります。
  • 変更後: AES.GCM.seal のnonceを省略し、APIに新しいランダムなnonceを生成させます。

参考資料