ルール
禁止事項 使わない 時代遅れの ハッシュ アルゴリズム ただし 文脈上
を使用することは避けてください。 使用する 時代遅れの ハッシュ アルゴリズム (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を使うのだ。このような脆弱なアルゴリズムが実運用に残っていると、攻撃対象が増えることになる。
.avif)
