現在の位置: ホーム> 最新記事一覧> PHPのMD5とSHA1の違いは何ですか?ハッシュ関数比較分析ガイド

PHPのMD5とSHA1の違いは何ですか?ハッシュ関数比較分析ガイド

gitbox 2025-09-19

この記事は、PHPでハッシュ機能を理解し、正しく適用したい開発者向けです。 MD5とSHA-1を比較して、PHPでの原則、出力、衝突抵抗、速度、典型的な用途、および実用的な使用から明確で実用的な提案を提供し、より安全な代替と使用法を説明します。

1。基本概念のレビュー(非常に短い)

  • ハッシュ(ハッシュ)関数:任意の長さの入力を受け入れ、固定長の「要約」を出力します。多くの場合、データの整合性を検証し、署名ベースを生成し、インデックスを作成します。

  • 不気期性:ハッシュ関数は一方向である必要があります。理論的には、元の入力は要約から推定できません(ただし、攻撃者の能力に応じて絶対ではありません)。

  • 衝突:異なる入力が同じ出力を生成する場合。理想的なハッシュは衝突を見つけるのが難しいはずです。

2。MD5とSHA-1の技術仕様の比較

  • 出力長

    • MD5:128ビット、通常は32文字の六分位( D41D8CD98F00B204E9800998ECF8427Eなど)で表されます。

    • SHA-1:160ビット、通常は40文字の160文字( DA39A3EE5E6B4B0D3255BFEF95601890AFD80709など)で表されます。

  • セキュリティ(要約)

    • MD5:実用的で実行可能な衝突攻撃があることが証明されており、セキュリティに敏感なシナリオ(署名、証明書、パスワードストレージなど)で使用することはできません。

    • SHA-1:MD5よりも強いが、経験的にひび割れ(衝突を見つけるための研究/実験的証拠)、安全なハッシュとして徐々に非難されている。

  • スピード

    • MD5は通常、SHA -1(内部状態が短く、計算量が少ない)よりも高速ですが、速度の差は最新のハードウェアの主な考慮事項ではありません。セキュリティはより重要です。

3。PHPでの基本的な使用(例)

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-string">"hello world"</span></span><span>;

</span><span><span class="hljs-comment">// MD5</span></span><span>
</span><span><span class="hljs-variable">$md5</span></span><span> = </span><span><span class="hljs-title function_ invoke__">md5</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);         </span><span><span class="hljs-comment">// 32 hex</span></span><span>
</span><span><span class="hljs-variable">$md5_raw</span></span><span> = </span><span><span class="hljs-title function_ invoke__">md5</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>); </span><span><span class="hljs-comment">// オリジナルのバイナリ 16 バイト</span></span><span>

</span><span><span class="hljs-comment">// SHA-1</span></span><span>
</span><span><span class="hljs-variable">$sha1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">sha1</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);       </span><span><span class="hljs-comment">// 40 hex</span></span><span>
</span><span><span class="hljs-variable">$sha1_raw</span></span><span> = </span><span><span class="hljs-title function_ invoke__">sha1</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>); </span><span><span class="hljs-comment">// オリジナルのバイナリ 20 バイト</span></span><span>

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"MD5: <span class="hljs-subst">$md5</span></span></span><span>\n";
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"SHA1: <span class="hljs-subst">$sha1</span></span></span><span>\n";
</span></span>

キーを必要とするメッセージ認証(より安全な整合性検証)の場合、HMACを使用してください。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$key</span></span><span> = </span><span><span class="hljs-string">"secret-key"</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-string">"important payload"</span></span><span>;

</span><span><span class="hljs-comment">// より長く安全なハッシュを使用することをお勧めします(例:sha256)</span></span><span>
</span><span><span class="hljs-variable">$hmac</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hash_hmac</span></span><span>(</span><span><span class="hljs-string">'sha256'</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>, </span><span><span class="hljs-variable">$key</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"HMAC-SHA256: <span class="hljs-subst">$hmac</span></span></span><span>\n";
</span></span>

4.典型的な用途とリスク

  • 非セキュリティのユニークな識別/高速検証のみ(小さなリスクは受け入れられます)

    • MD5またはSHA-1の両方を使用して、ファイル名のハッシュ、シンプルなキャッシュキー、および重複排除の迅速な判断を生成できます(ただし、強力な一貫性保証に依存することはできません)。

  • 安全で敏感なシナリオに使用されます(絶対に推奨されません)

    • パスワードストレージ、デジタル署名、TLS/証明書指紋、署名検証など: MD5/SHA-1を使用しないでください。どちらも実際の衝突攻撃(特にMD5)を持ち、攻撃者は同じダイジェストから異なるメッセージを偽造できます。

  • ファイルの整合性検証

    • 送信中の偶発的な腐敗を防ぐためだけの場合(非相続シナリオ)、MD5/SHA-1はファイルのダウンロードページで依然として一般的です。ただし、悪意のある改ざんが心配な場合は、より強力なハッシュ(SHA-256/512)または署名(HMAC/パブリックおよびプライベートキーの署名)を使用してください。

5。既知の攻撃(要約)

  • MD5 :2000年代初頭から複数の衝突攻撃と実際の攻撃があり、セキュリティ目的で広く非推奨されています。

  • SHA-1 :長い間MD5よりも安全であると考えられていましたが、研究と実験では実用的な衝突が示されています(2017年にアカデミアが発表した実際の衝突デモなど)。したがって、安全要件が高い状況でも避けるべきです。

(注:上記は概要です。公開された研究と工学の実践は、衝突に抵抗するには2つが不十分であることを示しています。)

6.推奨されるプラクティス(PHPプラクティスの提案)

  1. パスワードは常に特別なパスワードを使用します。ハッシュ機能password_hash() / password_verify()を使用して、php default( password_default )は、最新のセキュリティアルゴリズム(bcryptやより良い実装など)を使用し、ランダムソルトとコスト要因を自動的に処理します。

     <span><span><span class="hljs-meta">&lt;?php</span></span><span>
    </span><span><span class="hljs-comment">// パスワードのハッシュと検証(例)</span></span><span>
    </span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">'user-password'</span></span><span>;
    </span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_DEFAULT);
    </span><span><span class="hljs-comment">// ストレージ $hash データベースに移動します</span></span><span>
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">password_verify</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$hash</span></span><span>)) {
        </span><span><span class="hljs-comment">// 検証が合格しました</span></span><span>
    }
    </span></span>
  2. メッセージの整合性と認証はHMACまたは署名で使用されます。敵対的な環境には、 hash_hmac() (たとえば、 sha256sha512 )を使用するか、公開鍵の署名(openssl_signなど)を使用してください。

     <span><span><span class="hljs-meta">&lt;?php</span></span><span>
    </span><span><span class="hljs-variable">$tag</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hash_hmac</span></span><span>(</span><span><span class="hljs-string">'sha256'</span></span><span>, </span><span><span class="hljs-variable">$message</span></span><span>, </span><span><span class="hljs-variable">$secret_key</span></span><span>);
    </span></span>
  3. 一般に、SHA-2またはSHA-3シリーズはハッシュよりも好まれます。たとえば、 SHA256SHA512 。これは、ハッシュ( 'SHA256'、$データ)またはハッシュ( 'SHA512'、$ data)を介してPHPで使用できます。これらは、強度がMD5/SHA-1よりも大幅に優れています。

  4. バイナリをより効率的に処理する必要がある場合は、元のバイナリ出力MD5($ data、true) / sha1($ data、true) )およびbase64エンコードストレージまたは結果の送信を使用できます。

  5. 「塩 +複数のハッシュを使用する」独自のパスワードハッシュスキームを作成しようとしないでください。エラーはメンテナンスが起こりやすいです。言語/フレームワークで推奨されるパスワードハッシュAPIを使用してください。

7。比較概要(簡潔なテーブル)

  • 出力の長さ:MD5 = 128ビット(32ヘキソ)、SHA-1 = 160ビット(40ヘキス)。

  • セキュリティ:SHA-1> MD5ですが、どちらも安全性の高いシナリオには適していません。

  • 速度:MD5はわずかに高速ですが、違いは選択基準(安全性の優先順位)であってはなりません。

  • 推奨される目的:安全でない一意の識別または互換性のあるシナリオのみ。安全な目的のために、SHA-2/SHA-3/HMAC/Password_Hashを使用してください。

8。実際の選択の提案(1つの文)

新しいコードを書いており、セキュリティを懸念している場合は、 MD5またはSHA -1を使用しないでください-Hash( 'Sha256'、$ data) / hash_hmac( 'sha256'、$ data、$ key)を整合性と認証に使用し、 password_hash()を使用してパスワードを管理します。履歴システムと互換性がある、またはセキュリティと関係のないシナリオでのMD5/SHA-1のみを考慮してください。