Aikido

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

セキュリティ

ルール
禁止事項 使わない 時代遅れの ハッシュ アルゴリズム ただし 文脈上 
を使用することは避けてください。 使用する 時代遅れの ハッシュ アルゴリズム (MD5、 SHA-1)
 セキュリティに セキュリティに敏感な を使用します。 これらは これらは 暗号的に
が壊れている、 簡単に  ブルートフォース そして 有害 システムの 保守性を損なう。

対応言語 45+

はじめに

MD5とSHA-1は、何十年もの間、暗号が解読されているにもかかわらず、プロダクション・コードベースに広く普及している。MD5は2004年以来、SHA-1は2017年以来、安全ではないと考えられている。しかし、開発者はパスワードのハッシュ化、デジタル署名、完全性検証のために、衝突攻撃やプリイメージ攻撃が現実的なセキュリティリスクとなるMD5とSHA-1を使い続けている。MD5の衝突を生成する計算コストは今や些細なものであり、SHA-1の衝突攻撃はクラウド・コンピューティング・リソースを使えば実用的だ。

なぜそれが重要なのか

セキュリティへの影響: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;
}

なぜ安全なのか?SHA-256と高い反復回数(31万回)を持つPBKDF2は、パスワードの解読を指数関数的に遅くする。ファイルの完全性を保証するSHA-256は衝突に強く、実用的な攻撃は知られていません。どちらのアルゴリズムも現在のセキュリティ標準とコンプライアンス要件を満たしています。

結論

MD5とSHA-1は、セキュリティに敏感なコードにはふさわしくない。これらの脆弱性は十分に文書化されており、悪用方法も公開されている。パスワードにはbcrypt、scrypt、Argon2を使い、完全性の検証にはSHA-256かSHA-3を使うのだ。このような脆弱なアルゴリズムが実運用に残っていると、攻撃対象が増えることになる。

よくある質問

ご質問は?

MD5やSHA-1を使用してもよいのはどのような場合ですか?

衝突耐性が要求されないセキュリティ以外のコンテキストに限る: キャッシュ鍵、機密性のないコンテンツ配布のためのETags、(悪意のある改ざんではなく)偶発的なデータ破損を検出するためのチェックサムなど。その場合でも、より弱いアルゴリズムが許容される理由を文書化すること。認証、認可、完全性検証、暗号署名などでは、これらのアルゴリズムは決して受け入れられない。

パスワードのハッシュ化にMD5やSHA-1の代わりに何を使うべきか?

bcrypt、scrypt、Argon2を使う。これらは、ソルティングを含む専用パスワードハッシュ関数で、ブルートフォース攻撃に対抗するために意図的に低速になっている。Argon2は現代の標準であり、2015年のPassword Hashing Competitionで優勝している。SHA-256のような汎用ハッシュ関数をパスワードに直接使うのは避けよう。どうしてもSHA-256を使いたい場合は、少なくとも31万回反復のPBKDF2でラップすること。

ファイルの完全性を保つためのSHA-256やSHA-3はどうですか?

SHA-256は現在安全で、広くサポートされている。SHA-3(Keccak)は、異なる内部構造でさらに強力なセキュリティ保証を提供し、万が一SHA-2が破られた場合の徹底的な防御を提供する。ほとんどのアプリケーションでは、SHA-256で十分である。SHA-512は、セキュリティマージンを増やしたい場合や、非常に大きなデータセットを扱う場合に使用する。どちらも、既知の衝突攻撃や前像攻撃に対する耐性がある。

すべてを壊さずに既存のMD5/SHA-1ハッシュを移行するには?

パスワードについては、移行時にデュアルハッシュを実装する。古いハッシュを一時的に保持し、ユーザーがログインに成功したら、新しいアルゴリズムでパスワードを再ハッシュし、データベースを更新する。APIトークンや整合性ハッシュの場合は、ハッシュ形式をバージョンアップする(例:md5:abc123 vs 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つの中央システムでセキュアに。
脆弱性を迅速に発見し、自動的に修正。

クレジットカードは不要。