鍵導出関数:PBKDF2、bcrypt、Argon2
GPU攻撃やASIC攻撃への耐性という観点からパスワードハッシュアルゴリズムを比較し、ワークファクターとメモリハードネスの調整方法を理解します。
「鍵導出関数:PBKDF2、bcrypt、Argon2」はCoddyKit上の無料Cloud & IT Cert Prepレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCloud & IT Cert Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。
パスワードハッシュが異なる理由
パスワードの保存には、password hashing function(PHF)またはkey derivation function(KDF)と呼ばれる、特殊な暗号関数が必要です。SHA-256のような通常の暗号学的ハッシュは高速になるよう設計されており、最新のGPUでは毎秒数十億個のSHA-256ハッシュを計算できます。この速度はパスワードの保存にとって危険です。攻撃者がハッシュデータベースを盗めば、毎秒数十億回の試行が可能になるためです。パスワード用KDFは意図的に低速に設計され、正規のログインはミリ秒単位で完了できる一方、総当たり攻撃は計算上実行困難になるよう調整できます。
ソルト:レインボーテーブルへの対策
専用のパスワード用KDFが存在する前、攻撃者はレインボーテーブルを使っていました。これはハッシュ値から平文パスワードへの対応表を事前計算したものです。salt(ソルト)はユーザーごとに異なるランダムな値で、ハッシュ化する前のパスワードの先頭または末尾に追加します。これにより、同じパスワードでもハッシュ値がすべて異なります。ソルトはハッシュと一緒にデータベースへ保存します。秘密にする必要はなく、ランダムであれば構いません。適切なソルトには、少なくとも16バイトであること、暗号学的に安全な乱数生成器で生成すること、ユーザーごとに保存すること(アカウント間で決して再利用しないこと)が求められます。
PBKDF2:パスワード用の標準方式
PBKDF2(Password-Based Key Derivation Function 2)はRFC 8018で定義され、NISTに承認されています。通常はHMAC-SHA-256を使い、パスワードとソルトに対してHMAC関数を設定可能な回数の反復で繰り返し適用します。反復回数はワークファクターです。NISTは2023年時点で、PBKDF2-HMAC-SHA256に少なくとも600,000回の反復を推奨しています。PBKDF2は広く使われています(Django、iOS Keychain、WPA2-PSKなど)が、GPU上で効率的に実装できるため、他の方式よりGPU耐性が低いという弱点があります。
# PBKDF2 example (Python pseudocode concept)
# import hashlib
# dk = hashlib.pbkdf2_hmac(
# 'sha256', # hash algorithm
# b'password', # password bytes
# b'random_salt', # salt bytes
# 600000 # iterations
# )bcrypt:メモリとCPUへの負荷
bcryptはNiels ProvosとDavid Mazieresによって1999年に設計され、現在も広く使われています。その主要な特徴はコストファクター(roundsパラメーター)で、値を1増やすごとに計算時間が2倍になります。bcryptは改変されたBlowfish暗号とEksblowfish key setupを使用します。これはCPUとメモリの両方に大きな負荷をかけるため、PBKDF2と比べてGPUで高速化することが困難です。また、bcryptのパスワード入力は72バイトに制限されており、それを超えるパスワードは切り捨てられます。そのため、一部の実装では長いパスワードを先にSHA-256でハッシュ化する必要があります。
# bcrypt cost factor
# Cost 10 = ~100ms on modern hardware
# Cost 12 = ~400ms
# Cost 14 = ~1600ms
# Each +1 doubles the work
# Recommended: cost 12-14 for web apps
# Command: htpasswd -bnBC 12 username passwordArgon2:現代的な選択肢
Argon2は2015年にPassword Hashing Competitionで優勝し、現在OWASPが推奨している方式です。3つのバリアントがあります。Argon2dは高速ですがサイドチャネル攻撃に対して脆弱で、暗号通貨に適しています。Argon2iはconstant-timeで動作し、パスワードハッシュに適しています。Argon2idは両者を組み合わせた方式で、ほとんどの用途に推奨されます。Argon2idは、time cost(反復回数)、memory cost(必要なRAM容量)、parallelism(スレッド数)の3つの要素を調整できます。大量のメモリを必要とするため、GPU上での並列化が非常に難しく、ASICでの実行は現実的に不可能です。
# Argon2id recommended parameters (OWASP 2023)
# Memory: 64MB (65536 KiB)
# Iterations: 3
# Parallelism: 4 threads
# Output length: 32 bytes
# argon2 -id -t 3 -m 16 -p 4 -l 32メモリハード性:GPU攻撃に強い理由
GPUには数千のコアがありますが、コアごとのメモリは限られているため、単純でメモリ消費の少ない計算の並列化を得意とします。Argon2やscryptのようなメモリハード関数は、1回のハッシュ計算ごとに大量のRAMを必要とします。攻撃者がそれぞれ64MBのメモリを必要とするArgon2idの計算を10,000個並列実行したい場合、640GBのGPU RAMが必要になります。これは、どのGPUクラスターが利用できる容量をも大幅に超えています。この性質をメモリハード性と呼び、攻撃者に低速な逐次計算を強いるか、攻撃を採算の合わないものにするほど莫大なハードウェア費用への投資を強います。
実運用でのワークファクター調整
適切なワークファクターは、ハードウェアと許容できる遅延によって異なります。一般的な目標は、認証1回あたりサーバーの本番環境用ハードウェアで100~300ミリ秒です。ハードウェアの性能が向上したら、ワークファクターも増やす必要があります。そのため、bcryptとArgon2はパラメーターをハッシュと一緒に保存し、透過的なアップグレードを可能にしています。次回のログイン時にパスワードを検証し、新しい、より高いパラメーターで再ハッシュ化する仕組みです。OWASPはPBKDF2、bcrypt、Argon2idについて、現在推奨される最小パラメーターを公開しているため、毎年確認してください。
scrypt:もう1つのメモリハードKDF
scryptはColin Percivalによって2009年に設計され、広く採用された最初のメモリハードKDFです。Litecoinや多くのパスワードマネージャーで使われています。scryptはN(CPU・メモリコスト)、r(ブロックサイズ)、p(並列化係数)によってパラメーター化されます。Argon2と同様に、Nの値を大きくすると計算ごとに大量のRAMが必要になります。scryptは安全だと考えられていますが、PHCで優勝し、より多くの暗号学的分析を受けているため、新規アプリケーションでは一般にArgon2idが推奨されます。どちらも適切な選択肢です。
使ってはいけないもの:MD5、SHA-1、ソルトなしSHA
パスワードに使用してはいけないハッシュ方式がいくつかあります。MD5(破られており、一般消費者向けハードウェアで毎秒数十億回のハッシュを計算可能)、SHA-1(同じ問題)、ソルトなしSHA-256(高速で、レインボーテーブルによる攻撃が容易)、単純な暗号化(可逆であり、鍵を盗まれるとすべてのパスワードが漏えい)です。LinkedIn(2012年)などの過去の情報漏えいではソルトなしSHA-1が使われ、1億1,700万件のパスワードが流出し、数日以内に解読されました。Adobe(2013年)では、パスワードをハッシュ化せず暗号化していました。これは根本的な誤解であり、1億5,300万件のアカウントが漏えいする結果となりました。これらの事件はSecurity+の試験範囲に含まれています。
暗号化鍵のための鍵導出
KDFは、パスワードハッシュを保存する代わりに、パスワードから暗号化鍵を導出するためにも使われます。ユーザーが暗号化された保管庫のマスターパスワードを設定すると、アプリケーションはKDFを使い、そのパスワードから実際のAES-256暗号化鍵を導出します。パスワードマネージャーが保管庫をローカルで復号できるのはこのためです。マスターパスワードに対してKDFを実行し、デバイスの外部に出ることのない暗号化鍵を再構成します。HKDF(HMAC-based Key Derivation Function)は、1つのエントロピーの高い秘密値から複数の鍵を導出するための標準方式であり、TLS 1.3ではハンドシェイク鍵とアプリケーション鍵の導出に使われています。
クレデンシャルスタッフィングとKDFによる保護
クレデンシャルスタッフィング攻撃では、ある侵害で盗まれたユーザー名とパスワードの組み合わせを、他のサービスに対して使い回します。強力なKDFは、侵害後にオフライン解析を行える時間を短縮します。攻撃者が1回の推測にマイクロ秒ではなく300ミリ秒を費やさなければならない場合、10文字のランダムパスワードを解析することは、計算量の面で現実的ではなくなります。ただし、KDFではサイト間でのパスワードの使い回しは防げません。これには、ユーザーが一意のパスワードを使用する必要があります。一意のパスワード + Argon2idによる保存 + MFAを組み合わせることで、認証情報を狙った攻撃は実質的に無効化できます。
理解度チェック
このレッスンで学んだCompTIA Security+(SY0-701)の概念について、理解度を確認しましょう。
レッスンのまとめ
このレッスンでは、パスワードKDFは意図的に低速であり、調整可能なワークファクターによってオフラインの総当たり攻撃を計算量の面で現実的でないものにすること、Argon2idやscryptのようなメモリハード関数は、計算ごとに大量のRAMを必要とすることでGPUによる並列化を阻止すること、そしてMD5、SHA-1、ソルトなしのハッシュは、複数の大規模な情報漏えい事件が示すとおり、パスワード保存にはまったく不適切であることを学びました。次は、ポスト量子暗号と、RSAおよびECCに代わるものとしてNISTが選定したアルゴリズムについて学びます。
よくある質問
「鍵導出関数:PBKDF2、bcrypt、Argon2」レッスンは無料ですか?
はい。「鍵導出関数:PBKDF2、bcrypt、Argon2」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cloud & IT Cert Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。
「鍵導出関数:PBKDF2、bcrypt、Argon2」で何を学びますか?
GPU攻撃やASIC攻撃への耐性という観点からパスワードハッシュアルゴリズムを比較し、ワークファクターとメモリハードネスの調整方法を理解します。 ブラウザで直接実行するハンズオンコードでCloud & IT Cert Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cloud & IT Cert Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCloud & IT Cert Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「鍵導出関数:PBKDF2、bcrypt、Argon2」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCloud & IT Cert Prepレッスンでコードを書いて実行できますか?
はい。すべてのCloud & IT Cert Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- TLS 1.3ハンドシェイクと0-RTT再開
- 認証付き暗号:AES-GCMとChaCha20-Poly1305
- 鍵導出関数:PBKDF2、bcrypt、Argon2
- ポスト量子暗号:CRYSTALS-KyberとDilithium