2012-01-14 7 views
0

PHPサイトで問題を解決しようとしています。"MD5 decrypt" PHP関数からMySQLストアドファンクション

function get_rnd_iv($iv_len) { 
     $iv = ''; 
     while ($iv_len-- > 0) { 
       $iv .= chr(mt_rand() & 0xff); 
     } 
     return $iv; 
} 
function md5_encrypt($plain_text, $password, $iv_len = 16) { 
     $plain_text .= "\x13"; 
     $n = strlen($plain_text); 
     if ($n % 16) $plain_text .= str_repeat("\0", 16 - ($n % 16)); 
     $i = 0; 
     $enc_text = get_rnd_iv($iv_len); 
     $iv = substr($password^$enc_text, 0, 512); 
     while ($i < $n) { 
       $block = substr($plain_text, $i, 16)^pack('H*', md5($iv)); 
       $enc_text .= $block; 
       $iv = substr($block . $iv, 0, 512)^$password; 
       $i += 16; 
     } 
     return base64_encode($enc_text); 
} 
function md5_decrypt($enc_text, $password, $iv_len = 16) { 
     $enc_text = base64_decode($enc_text); 
     $n = strlen($enc_text); 
     $i = $iv_len; 
     $plain_text = ''; 
     $iv = substr($password^substr($enc_text, 0, $iv_len), 0, 512); 
     while ($i < $n) { 
       $block = substr($enc_text, $i, 16); 
       $plain_text .= $block^pack('H*', md5($iv)); 
       $iv = substr($block . $iv, 0, 512)^$password; 
       $i += 16; 
     } 
     return preg_replace('/\\x13\\x00*$/', '', $plain_text); 
} 

これらは、データベース内のユーザーのIPアドレスを暗号化するために使用されます。 $ passwordパラメータはphp設定ファイルに格納されています(したがって、これらの関数を知っていてもsqlをダンプするだけではIP-sが得られません)。

MD5がはっきりとハッシュしているので、私はまだ戸惑っています。

もっと多くのphp経験を持つ人がこの解読の仕組みを説明できますか?暗号化されたテキストは単純なMD5ではないので、そこで何が起こっているのか理解しなければならないかもしれません。

とにかく私は、IP-s(国のIP範囲を含むテーブル)で他のテーブルに加わりたいので、復号化を行っているmysqlストアド関数を書こうとしています。クエリ。

問題は次のとおりです。私はMySQLの関数を書いたことがありません。どのようにしてサイクルを作りますか? MySQLには組み込まれていないpackやpreg_replaceのような関数がありますが、どうにか実装する必要がありますか?

(ヒントからフル機能まで)何か助けていただければ幸いです!

「MD5を解読できません」というようなコメントは、ハッシュです!感謝しません。

+0

md5はIVでのみ使用されます - 暗号化自体はXORのようなものです... – Yahia

+1

本当に暗号化が必要ですか?このような可逆的なスキームは安全ではありません(セキュリティの観点から)ハッシングは、IPアドレスを比較するだけでよく、MySQLはすでにハッシングのための多くの機能を備えています。 –

+1

あなたは完全なコードを投稿していません。以下は完全なコードです:http://www.jonasjohn.de/snippets/php/md5-based-block-cipher.htm – Sawny

答えて

0

これらの関数では、md5は定数コンポーネント$iv_lenのハッシュを計算するためにのみ使用されます。これはあとでパスワードの塩のように使用されます。

他のすべての操作は、MySQLの機能については

可逆(文字列のパディング、梱包およびXOR [^])している、私はそれをしないだろう。 IMHOより良い解決策は、ユーザテーブルをcountry_from_ipカラムで拡張し、既存のすべてのIPを解読し、国コードを取得し、新しいレコードを保存しながらこの情報を追加するPHPコードを変更することです。関数によって計算されたフィールドに参加作る

は非常にすぐになりますMD5ハッシュは、IPアドレス上で実行されていないアプリケーションのボトルネック

+0

はい、私はこれが最善の解決策だと思います。私はそれを書こうとしています – SoonDead

0

、暗号化にいくつかのランダムシードデータを追加するために使用されるように表示されます、 か何か。

これを解読する方法については、なぜSQLを使いたいのですか?おそらく可能ですが、私はこのタイプの操作でPHPがはるかに高速であると考えています。

一度に1000ユーザーの行を選択するためにSQLを使用し、PHPを使用して実際に各国とリンクします。

+0

ipranges-countriesはデータベースに保存されており、すべての単一IPアドレスに対してクエリを実行したくありません。私はmysql関数の速度についてはわかりませんが、私の経験では、クエリを返すと、すべてのレコードを変換し、それぞれのクエリを実行した後は、通常は悪い練習ですが、SQLで変換を行うことができます。これは私があなたを信じなければならないかもしれない悪い考えです。ちょうど面白い問題に思えました。 – SoonDead