Swiftの機密データへの弱いハッシュの使用

機密データへの弱いハッシュの使用

説明

MD5とSHA-1は衝突攻撃に弱いため、衝突耐性が必要な完全性検証やデータの識別には使わないでください。パスワードの保存には、衝突耐性だけでなく、オフラインでの推測攻撃を遅くするためのハッシュ設計も必要です。

想定される影響

  • 完全性検証の回避
  • トークンや認証データを偽造されるリスクの増大
  • パスワード保存の保護の低下

対処方法

  1. セキュリティに関わる汎用ハッシュには、SHA-256、SHA-512、SHA-3を使います。
  2. パスワードの保存には、Argon2id、bcrypt、scrypt、PBKDF2などの専用アルゴリズムを使います。
  3. 互換性のために残すMD5やSHA-1の処理は、セキュリティ上の判断に使う処理から分離します。

例

変更前

swift
let digest = Insecure.MD5.hash(data: tokenData)

変更後

swift
import Foundation
import CryptoKit

func hashToken(_ tokenData: Data) -> SHA512.Digest {
    return SHA512.hash(data: tokenData)
}

説明:

  • 変更前: 識別用のダイジェストにMD5を使っても、強い衝突耐性は得られません。
  • 変更後: 十分なエントロピーを持つトークンの識別用ダイジェストには、SHA-2やSHA-3を使えます。パスワードにはSHA-512のような高速なハッシュではなく、Argon2id、scrypt、bcrypt、PBKDF2が必要です。

参考資料