ホームページ > バックエンド開発 > PHPチュートリアル > MD5 変換アルゴリズムを使用して徹底的な (衝突) パスワード クラッキングを防ぐ_PHP チュートリアル

MD5 変換アルゴリズムを使用して徹底的な (衝突) パスワード クラッキングを防ぐ_PHP チュートリアル

WBOY
リリース: 2016-07-13 17:21:40
オリジナル
946 人が閲覧しました

MD5 は、Web アプリケーションで最も一般的に使用されるパスワード暗号化アルゴリズムです。 MD5 は不可逆であるため、MD5 によって計算された暗号文を使用して、逆アルゴリズムを通じて元のテキストを取得することはできません。

ウェブアプリケーションでMD5暗号化テキストパスワードを使用する本来の目的を振り返ると、データベースに保存されているパスワードが残念ながら漏洩した直後に取得されることを防ぐためです。しかし、攻撃者は膨大なパスワード辞書を所有しているだけでなく、MD5 暗号文を解読する効率的な方法である、一般的に使用されるパスワードの MD5 暗号文をすぐに見つけることができる多くの MD5 原文と暗号文の比較データベースを確立しています。ただし、MD5 暗号文データベースでは、最も一般的な MD5 暗号化アルゴリズム (元のテキスト --> MD5 --> 暗号文) が使用されます。したがって、変換された MD5 アルゴリズムを使用して、既製の MD5 暗号文データベースを無用にすることができます。


以下は、変換アルゴリズムのいくつかの例を示しています 
もちろん、他の Web 開発言語でも同様であり、同じ結果が得られます。

変換 1: Cyclic MD5

最も理解しやすい変換は、パスワードに対して複数の MD5 操作を実行することです。 2 つの仮パラメータ $data と $times を受け入れる関数をカスタマイズします。1 つ目は暗号化するパスワード、2 つ目は暗号化を繰り返す回数です。この変換を実現するには 2 つのアルゴリズムがあります -

//反復アルゴリズム
function md5_1_1($data, $times = 32)
{ i < $i++) {
$data = md5 ($data);
}
return $data;
}

//再帰アルゴリズム
function md5_1_2($data, $times = 32)
{
if ($times > Return $data;
}
}
? >

変換 2: 暗号文分割 MD5

ユーザーのパスワードは不確実な文字列ですが、MD5 を 1 回操作すると、この時点で固定長文字列を再度変換できます。やや BT アルゴリズムでは、この暗号文をいくつかのセグメントに分割し、各セグメントに対して MD5 操作を実行し、次に暗号文の山を連結して非常に長い文字列にし、最後に別の MD5 操作を実行します。結果は依然として長さのある暗号文です。 32ビットの。

//暗号文を 2 つのセクションに分割し、各セクションの長さは 16 文字です
function md5_2_1($data)
{
//最初にパスワードを 32 文字の暗号文に暗号化します
$data = md5( $data);
//パスワードを 2 つの部分に分割します
$left = substr($data, 0, 16);
// それらを別々に暗号化します
$data = md5($left).md5($right);
//最後に長い文字列を再度暗号化して 32 文字の暗号文になります
return md5($data)
}

// パスワードを暗号化しますは 32 のセクションに分かれており、各セクションには 1 文字が含まれます
function md5_2_2($data)
{
$data = md5($data)
//ループして暗号文の各文字をインターセプトし、暗号化して接続します
for ( $ i = 0; $i < $i++) {
.= md5($data{$i}) }
//このとき、$data の長さは 1024 文字です。
Return md5($data);
}
?>

もちろん、この種の暗号文の分割には無数の固有のアルゴリズムがあります。たとえば、元の暗号文はそれぞれ 2 文字の 16 個のセグメントに分割できます。 8 つのセグメント。各段落には 4 文字が含まれているか、各段落の文字数が等しくありません...

変換 3: 追加の文字列干渉
暗号化プロセスの 1 つのステップで、特定の内容を含む文字列 (例:ユーザー名) が追加され、干渉データが暗号化されます。ランダムな文字列は、元のアルゴリズムを再現できなくなるため使用できません。このアルゴリズムは、場合によっては非常に有利です。たとえば、多数のユーザーのパスワードを暗号化するために使用すると、攻撃者がアルゴリズムを知っていたとしても、ユーザー名が追加の干渉文字列として使用される可能性があります。辞書内に一度に多数の比較テーブルが生成され、多数のユーザーのパスワードが解読され、少数のユーザーのみが対象として列挙されます。

//元のデータの末尾に文字列を追加します
function md5_3_1($data, $append)
{
Return md5($data.$append)
}

//元のデータの末尾の文字列 Header
function md5_3_2($data, $append)
{
return md5($append.$data)
}

//元のデータの先頭と末尾に追加の文字列
function md5_3_3($data, $append)
{
Return md5($append.$data.$append);
?>

変換 4: 大文字と小文字の変換の干渉
PHP が提供する md5() 関数は小文字であるため、すべてを大文字に変換してから MD5 操作を実行できます。

function md5_4($data)
{
//まずパスワードの暗号文を取得します
$data = md5($data)
// 暗号文内のすべての英字を大文字に変換します。
$ data = strtotime($data);
//最後に別の MD5 操作を実行し、
return md5($data);
?>

変換 5: 文字列の順序の干渉
MD5 操作の後に暗号文を配置します文字列の順序が逆になると、MD5 操作が再度実行されます。

function md5_5($data)
{
//データの暗号文を取得します
$data = md5($data)
//暗号文文字列の文字順序を反転します
$data = strrev; ($data);
//最後に別の MD5 操作を実行し、
return md5($data)
?>

変換 6、変換 7、変換 8...

MD5 変換アルゴリズムは無限の可能性があり、自分で作成する必要さえありません。上記の 5 つの組み合わせを使用するだけで、まさに BT アルゴリズムを作成できます。たとえば、最初に暗号化をループしてから分割し、各セグメントに文字列を追加して個別に暗号化し、大文字と小文字を変更して文字列の順序を逆にして、それらを長い文字列に連結してから MD5 を実行します。操作...

本当に難しい場合 残念ながら、SQL インジェクションやファイル システム内のデータベースがダウンロードされてユーザー パスワード データが漏洩するなど、特定の脆弱性が原因で、MD5 変換アルゴリズムは解読の難易度を大幅に高める可能性があります。 1 つ目は、インターネット上に多数の MD5 を作成することです。元のテキストと暗号文の比較データベース (ご存じのとおり、これが MD5 を解読する最も効率的な方法です) は役に立ちません。その後、攻撃者は従来のアルゴリズムを使用して列挙することに疲れ果てます。変換アルゴリズムによって取得された暗号文の文字列。もちろん、MD5 変換アルゴリズムは、非オープン ソース Web プログラムでの使用に特に適していますが、オープン ソース プログラムで使用する利点は薄れますが (アルゴリズムは誰もが知っています)、MD5 のオリジナルの役割が抑制される可能性もあります。テキスト/暗号文比較データベース。これらの複雑な変換操作を実行するには、当然、より多くのシステム オーバーヘッドがかかりますが、厳格なセキュリティ要件を持つシステムの場合、より高いセキュリティと引き換えに、より多くの費用を支払う価値があります。



http://www.bkjia.com/PHPjc/532414.html

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/532414.html技術記事 MD5 は、Web アプリケーションで最も一般的に使用されるパスワード暗号化アルゴリズムです。 MD5 は不可逆であるため、MD5 によって計算された暗号文を使用して、逆アルゴリズムを通じて元のテキストを取得することはできません。 Web アプリのレビュー...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート