Aikido

MD5とSHA-1の使用を停止:セキュリティのための最新ハッシュ

セキュリティ

ルール
文脈上 正当な 理由が ない限り、 古い ハッシュ アルゴリズムを 使用しない でください。 セキュリティ上 重要な あらゆる コンテキストで、 古い ハッシュ アルゴリズム (MD5、 SHA-1) 使用は 避けてください。 これらは 暗号学的に
破られており、 ブルートフォース攻撃が 容易で、 システムの 保守性を 損ないます。

サポート言語: 45+

はじめに

MD5とSHA-1は、数十年前から暗号学的に破綻しているにもかかわらず、本番環境のコードベースで依然として広く使用されています。MD5は2004年以来、SHA-1は2017年以来安全でないと見なされてきました。しかし、開発者はパスワードハッシュ、デジタル署名、および整合性検証にこれらを使い続けており、そこでは衝突攻撃や原像攻撃が現実のセキュリティリスクをもたらします。MD5の衝突を生成するための計算コストは現在では取るに足らないものであり、SHA-1の衝突攻撃はクラウドコンピューティングリソースがあれば実用的です。

なぜ重要なのか

Security implications: MD5とSHA-1は、2つの異なる入力が同じハッシュ出力を生成する衝突攻撃に対して脆弱です。攻撃者はこれをエクスプロイトして、正当なファイルと同じハッシュを持つ悪意のあるファイルを作成し、整合性チェックをバイパスします。パスワード保存の場合、これらのアルゴリズムは高速であるため壊滅的に弱く、ブルートフォース攻撃やレインボーテーブル攻撃を容易にします。現代のGPUは1秒あたり数十億のMD5ハッシュを計算でき、これは8文字のパスワードが数時間で解読されることを意味します。

コンプライアンスと法的リスク: PCI DSS、HIPAA、SOC 2などのセキュリティ標準は、暗号目的でのMD5およびSHA-1の使用を明示的に禁止しています。規制された環境でこれらを使用すると、監査の失敗や法的責任が生じます。主要なブラウザは現在、SHA-1証明書に遭遇するとユーザーに警告を発し、信頼を損ない、サービスへのアクセスをブロックする可能性があります。

コードの保守性: コード内で古いハッシュアルゴリズムが発見された場合、直ちに対処が必要です。これは、データが蓄積されるにつれて移行が困難になるため、時間とともに増大する技術的負債を生み出します。安全なアルゴリズムを早期に導入することで、費用のかかる将来の移行や緊急のセキュリティパッチを防ぐことができます。

攻撃対象領域の拡大: 脆弱なハッシュアルゴリズムは、複数の攻撃ベクトルを生み出します。パスワードデータベースはオフラインクラッキングに対して脆弱になり、デジタル署名は偽造される可能性があり、ファイル整合性システムは迂回されることがあります。MD5またはSHA-1の各使用は、発生を待つ潜在的なセキュリティインシデントです。

コード例

❌ 非準拠:

const crypto = require('crypto');

function hashPassword(password) {
  return crypto.createHash('md5')
    .update(password)
    .digest('hex');
}

function verifyFileIntegrity(fileContent, expectedHash) {
  const hash = crypto.createHash('sha1')
    .update(fileContent)
    .digest('hex');
  return hash === expectedHash;
}

安全でない理由:パスワードハッシュにMD5を使用しても、最新のクラッキングツールに対してセキュリティは提供されません。ファイル整合性チェックのためのSHA-1は衝突攻撃によって破られる可能性があり、悪意のあるファイルが検証を通過することを許してしまいます。どちらのアルゴリズムもブルートフォース攻撃に対して計算コストが低いです。

✅ 準拠済み:

const crypto = require('crypto');

async function hashPassword(password) {
  const salt = crypto.randomBytes(16);
  return new Promise((resolve, reject) => {
    crypto.pbkdf2(password, salt, 310000, 32, 'sha256', (err, key) => {
      if (err) reject(err);
      resolve({ salt: salt.toString('hex'), hash: key.toString('hex') });
    });
  });
}

function verifyFileIntegrity(fileContent, expectedHash) {
  const hash = crypto.createHash('sha256')
    .update(fileContent)
    .digest('hex');
  return hash === expectedHash;
}

安全な理由:PBKDF2とSHA-256、および高い反復回数(310,000)を使用することで、パスワードクラッキングが指数関数的に遅くなります。ファイル整合性チェックのためのSHA-256は衝突耐性があり、既知の実用的な攻撃はありません。どちらのアルゴリズムも現在のセキュリティ標準とコンプライアンス要件を満たしています。

まとめ

MD5とSHA-1は、セキュリティ上重要なコードには使用すべきではありません。それらの脆弱性は十分に文書化されており、エクスプロイトが公開されており、主要なすべての言語で安全な代替手段が存在します。移行パスは明確です。パスワードにはbcrypt、scrypt、またはArgon2を、整合性検証にはSHA-256またはSHA-3を使用してください。これらの脆弱なアルゴリズムが本番環境に残るたびに、攻撃対象領域が増加します。

よくある質問

ご質問がありますか?

MD5またはSHA-1の使用が許容されるのはどのような場合ですか?

衝突耐性が不要な非セキュリティコンテキストでのみ使用してください。例えば、キャッシュキー、機密性の低いコンテンツ配信用のETag、偶発的なデータ破損(悪意のある改ざんではない)を検出するためのチェックサムなどです。その場合でも、より弱いアルゴリズムが許容される理由を文書化してください。認証、認可、整合性検証、または暗号署名には、これらのアルゴリズムは決して許容されません。

パスワードのハッシュ化には、MD5とSHA-1の代わりに何を使用すべきですか?

bcrypt、scrypt、またはArgon2を使用してください。これらは、ソルト処理を含み、ブルートフォース攻撃に耐えるように意図的に処理速度を遅く設計された、パスワードハッシュ専用の関数です。Argon2は現代の標準であり、2015年のパスワードハッシュコンペティションで優勝しました。SHA-256のような汎用ハッシュ関数をパスワードに直接使用することは避けてください。これらは処理が速すぎるためです。もしSHA-256を使用する必要がある場合は、最低310,000回のイテレーションでPBKDF2にラップしてください。

ファイルの整合性にはSHA-256またはSHA-3についてはどうですか?

SHA-256は現在、安全であり広くサポートされています。SHA-3 (Keccak)は、異なる内部構造によりさらに強力なセキュリティ保証を提供し、SHA-2が将来破られた場合の多層防御となります。ほとんどのアプリケーションでは、SHA-256で十分です。追加のセキュリティマージンが必要な場合や、非常に大規模なデータセットを扱う場合は、SHA-512を使用してください。どちらも既知の衝突攻撃および原像攻撃に対して耐性があります。

既存のMD5/SHA-1ハッシュを、システム全体に影響を与えずにどのように移行しますか?

パスワードについては、移行中にデュアルハッシュを実装してください。古いハッシュは一時的に保持し、ユーザーが正常にログインした際に新しいアルゴリズムでパスワードを再ハッシュし、データベースを更新します。APIトークンまたは整合性ハッシュについては、システムが移行中に両方を処理できるように、ハッシュ形式をバージョン管理します(例:md5:abc123とsha256:def456)。移行期限を設定し、その日付以降は残りのユーザーにリセットを強制します。

これらのアルゴリズム間にパフォーマンスの違いはありますか?

はい、しかしセキュリティ上重要な意味を持つ方法ではありません。MD5はSHA-256よりも高速ですが、これはパスワードハッシュにおいて「遅さ」が機能であるという点でまさに問題となります。ファイルの整合性に関しては、現代のハードウェアではパフォーマンスの差はごくわずかです。SHA-256は、通常ミリ秒単位で測定されるディスクI/Oを伴う操作にマイクロ秒を追加する程度です。セキュリティ上の利点は、いかなるパフォーマンスコストをもはるかに上回ります。

MD5またはSHA-1を使用したHMACについてはどうですか?

HMAC-MD5およびHMAC-SHA-1は、HMACが追加のセキュリティ特性を提供するため、基本ハッシュ関数よりも攻撃に対する耐性があります。しかし、これらはほとんどのセキュリティ標準で非推奨とされています。代わりにHMAC-SHA-256を使用してください。パフォーマンスの差はごくわずかであり、コンプライアンス上の問題を回避できます。HMAC-SHA-256は連邦政府での使用が承認されており(FIPS 198-1)、すべての主要なセキュリティ標準を満たしています。

コードベース内のMD5/SHA-1のすべてのインスタンスをどのように見つけますか?

一般的なパターン(md5、sha1、MessageDigest.getInstance("MD5")、hashlib.md5()、crypto.createHash('md5')など)を検索します。SHA-1証明書を使用するSSL/TLS設定について、依存関係の構成を確認してください。これらのアルゴリズムを必要とする可能性のあるサードパーティとのAPI統合をレビューします。自動コードスキャンツールは、複数の言語でこれらのパターンを検出し、レビューのためにフラグを立てることができます。

今すぐ、安全な環境へ。

コード、クラウド、ランタイムを1つの中央システムでセキュアに。
脆弱性を迅速に発見し、自動的に修正。

クレジットカードは不要です | スキャン結果は32秒で表示されます。