ルール
文脈上 正当な 理由が ない限り、 古い ハッシュ アルゴリズムを 使用しない でください。 セキュリティ上 重要な あらゆる コンテキストで、 古い ハッシュ アルゴリズム (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を使用してください。これらの脆弱なアルゴリズムが本番環境に残るたびに、攻撃対象領域が増加します。

