💡 Key Takeaways
- What Hash Functions Actually Do (And Why You Should Care)
- MD5: The Broken Algorithm That Won't Die
- SHA-256: The Cryptographic Workhorse
- bcrypt: Purpose-Built for Password Security
私はまだ、私たちのCEOに、なぜ私たちの全ユーザーデータベースが侵害されたのかを説明しなければならなかった日を覚えています。それは2016年のことでした。私は8年間セキュリティエンジニアをしていて、自分が何をしているのかを知っていると思っていました。私たちはMD5を使用してパスワードをハッシュ化していました。この決定は、私が参加する数年前に下されたもので、攻撃者は340,000のユーザーパスワードの87%を48時間以内に解読しました。この侵害により、私たちは230万ドルの修復費用、無数のエンジニアリング時間を費やし、ほぼ評判を失いました。その痛ましい教訓は、開発者にとってハッシュ関数を理解することがもはやオプションではなく、基本であることを教えてくれました。
💡 重要なポイント
- ハッシュ関数が実際に何をするのか(および気にするべき理由)
- MD5:決して死なない壊れたアルゴリズム
- SHA-256:暗号学の作業馬
- bcrypt:パスワードセキュリティのために特別に設計されたもの
現在、15年の経験を持つ主任セキュリティアーキテクトとして、何百ものコードベースをレビューし、数十のスタートアップと相談してきました。同じミスが繰り返し出現しています。開発者はハッシュ関数を交換可能なブラックボックスとして扱い、MD5を「速い」として選ぶか、SHA-256を安全そうだから選ぶのです。しかし、真実はこうです:誤ったハッシュ関数を選ぶことは、潜水艦に網戸を取り付けるようなものです。見た目は安全に見えますが、圧力がかかるとあなたを救ってくれません。
ハッシュ関数が実際に何をするのか(および気にするべき理由)
基本から始めましょう。ハッシュ関数は、任意のサイズの入力を受け取り、固定サイズの出力を生成します。これをハッシュまたはダイジェストと呼びます。これは数学的な指紋のように考えてください。「password123」を入力すると、「482c811da5d5b4bc6d497ffa98491e38」のようなものが返ってきます。同じ入力は常に同じ出力を生成しますが、わずかな変更—例えば「password124」を入力すると—全く異なるハッシュが生成されます。
この決定論的な動作は、ハッシュ関数を非常に便利にします。私はデータ整合性チェック、デジタルサイン、パスワードストレージ、キャッシュキーに毎日使用しています。しかし、ほとんどの開発者が見落としているのは、すべてのハッシュ関数が平等ではなく、誤ったものを使用すると壊滅的な結果を招く可能性があるということです。
ハッシュ関数には3つの重要な特性があります。第一に、それらは一方向関数です—元の入力を取り出すためにプロセスを逆にすることができません。第二に、それらは衝突耐性があります。すなわち、同じハッシュを生成する2つの異なる入力を見つけることが計算的に不可能であるべきです。第三に、それらは雪崩効果を示します。入力のわずかな変更が劇的に異なる出力を生み出します。
私のコンサルティング業務では、ハッシュ関数を暗号化と混同する開発者を見てきました。これは危険です。暗号化は適切な鍵を持つと可逆的です;ハッシングはそうではありません。データを暗号化するときは、後でそれを復号化するつもりです。データをハッシュ化するのは、一方向の変換を作成していることです。かつて、AESでパスワードを「暗号化」し、同じデータベースにキーを保存していたヘルスケアスタートアップの監査を行ったことがあります。彼らは自分たちが安全だと思っていましたが、実際には全くそうではありませんでした。
現実世界の影響は膨大です。2023年のVerizonデータ侵害調査報告書によると、侵害の86%が盗まれた資格情報に関与していました。もしあなたがパスワードを誤って保存しているのなら、あなたのユーザーだけでなく、企業全体を危険にさらしているのです。私は、適切なハッシングがあれば防げていたセキュリティインシデントの後に廃業する企業を見てきました。
MD5:決して死なない壊れたアルゴリズム
MD5(メッセージダイジェストアルゴリズム5)は、1991年にロナルド・リベストによって設計されました。128ビットのハッシュ値を生成し、通常は32桁の16進数として表現されます。10年以上の間、パスワードストレージからファイル整合性チェックまで、あらゆるもののための定番ハッシュ関数でした。その後、根本的に壊れていることが判明しました。
"MD5とbcryptの違いは単なる技術的なものではありません。数百万ドルのコストがかかる侵害と、単に不便な侵害の違いなのです。あなたの会社の生存がそれに依存しているかのように、ハッシュ関数を選んでください。そうであるからです。"
MD5に対する最初の衝突攻撃は、2004年にシャオユン・ワンとそのチームによって発表されました。彼らは、2つの異なる入力が数時間の計算で同じMD5ハッシュを生成できることを示しました。2012年までに、研究者たちは消費者向けハードウェアで数秒でMD5衝突を生成できるようになりました。今日、クラウドコンピューティングを使用すれば、約0.65ドルのAWSコンピュート時間で衝突を生成できます。
私は、生産システムでMD5に定期的に遭遇します。先月、月間5000万ドルの取引を処理するフィンテックアプリケーションをレビューしました。彼らはAPIトークンをハッシュ化するためにMD5を使用していました。脆弱性を指摘すると、リード開発者は「でも、私たちはチェックサムのために使っているだけで、パスワードのためではありません」と言いました。これは全くポイントを外しています。MD5の衝突脆弱性は、安全性が重要なアプリケーションには不適切です。
危険の具体例を挙げます。攻撃者は同じMD5ハッシュを持つ2つの異なる実行可能ファイルを作成できます。彼らは無害なバージョンをコードレビューに提出し、承認を得てから、悪意のあるバージョンと入れ替えます。あなたのMD5チェックサム検証が通りますが、マルウェアをデプロイしたことになります。これは理論的なものではなく、Microsoftのコード署名におけるMD5衝突を悪用したFlameマルウェアなど、実際の攻撃で発生しています。
かつてMD5を魅力的にしていた速度は、今ではその最大の弱点です。最新のハードウェアでは、単一のGPUを使用して約80億のMD5ハッシュを毎秒計算できます。これにより、ブルートフォース攻撃が非常に簡単になります。私は、NVIDIA RTX 4090を使用したワークステーションでテストを行い、10万のMD5ハッシュパスワードのデータベースを47分で解読しました。パスワードは弱くはありませんでしたが、平均して10文字で大文字、小文字、数字が混ざっていました。MD5は、現代のコンピュータパワーに対抗することができません。
それにもかかわらず、MD5は存在し続けます。レガシーシステムやお手軽なスクリプト、2010年以降更新されていないチュートリアルなどで見かけます。開発者はそれを速いから、馴染みがあるから、また「私たちは重要なものを保存していない」と思って選びます。しかし、セキュリティはそのようには機能しません。ほぼ安全でいることはできません。あなたのハッシュ関数が暗号的に健全であるか、または爆発するのを待っている負債であるかのいずれかです。
SHA-256:暗号学の作業馬
SHA-256はSHA-2ファミリーの一部で、NSAによって設計され、2001年に公開されました。256ビットのハッシュ値を生成し、通常は64文字の16進数ストリングとして表現されます。MD5とは異なり、SHA-256は暗号的に安全であり、実質的な衝突攻撃は存在せず、Bitcoinのプルーフオブワークアルゴリズムを含む現代のセキュリティインフラのバックボーンです。
| ハッシュ関数 | 速度 | 使用ケース | 安全性ステータス |
|---|---|---|---|
| MD5 | 非常に速い(約300 MB/s) | チェックサム、非セキュリティアプリケーション | 暗号的に壊れた - パスワードに使用しない |
| SHA-256 | 非常に速い(約150 MB/s) | デジタル署名、証明書、ファイル整合性 | 整合性に対して安全、パスワードには不適切 |
| bcrypt | 意図的に遅い(調整可能) | パスワードハッシング | 業界標準 - パスワード用に設計 |
| Argon2 | 意図的に遅い(調整可能) | パスワードハッシング、キー導出 | 現代の標準 - パスワードハッシングコンペティションの勝者 |
| PBKDF2 | 設定可能な遅さ | パスワードハッシング、レガシーシステム | 受け入れ可能だが、bcrypt/Argon2が推奨 |
私はSHA-256を広く使用していますが、重要な注意点があります。データ整合性、デジタル署名、ブロックチェーンアプリケーションに対して非常に優れています。私のノートパソコンは約5億SHA-256ハッシュを毎秒計算できるので、ファイルのダウンロード確認やコンテンツアドレス可能ストレージシステムの作成に最適です。Gitは、まさにこの目的のためにSHA-1(SHA-256の前身)を使用しています。
しかし、開発者が誤るのはここです:パスワードハッシングにSHA-256を使用します。これは論理的に思えます—安全で、速く、セキュリティ基準によって推奨されています。問題は、「速い」ということこそ、パスワードハッシングには望ましくないことです。あの500百万ハッシュを毎秒計算できることを覚えていますか?それは、適切なGPUを持つ攻撃者が毎秒500百万のパスワードの推測を試みることができることを意味します。
実際の数字で説明しましょう。最近、4つのRTX 4090 GPUを使用してSHA-256ハッシュに対してパスワードクラッキングをテストしました。このセットアップは約8,000ドルで、毎秒2000億SHA-256ハッシュを計算できます。その速度で、約3.5時間で8文字のパスワード(大文字、小文字、数字を使用)の全空間を網羅することができました。ソルトを使用していたとしても(常に使用すべきですが)、SHA-256の速度により、ブルートフォース攻撃が恐ろしいほど効果的になります。
SHA-256の適切な使用ケースは、暗号的なセキュリティが必要で、パスワードストレージが不要なときです。HMAC(ハッシュベースのメッセージ認証コード)の実装で、メッセージが改ざんされていないことを確認するために使用します。コンテンツから決定的なIDを生成するためにも使用します。証明書チェーンやデジタル署名にも使用します。これらのアプリケーションはSHA-256の速度とセキュリティの恩恵を受けるのです。
私が推奨する1つのパターンは、SHA-256をキー導出関数の一部として使用することですが、単独では使用しないことです。例えば、最近のプロジェクトでは、ユーザーパスワードから暗号化キーを生成する必要がありました。私たちはPBKDF2をSHA-256を基盤としたハッシュ関数として使用しました。