0

PHPサイトで問題を修正しようとしています。PHP関数のペアがあります:

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は提供されません)。

MD5は明らかにハッシュ化されており、bruteforcingのようなものだけがそれを元に戻すことができるので、私はまだそれらに戸惑っています。

PHPの経験が豊富な人は、この復号化がどのように機能するかを説明できますか?暗号化されたテキストは単純なMD5ではないため、そこで何が起こっているのかを理解する必要があるかもしれません。

とにかく、IPによって他のテーブル(国のIP範囲を含むテーブル)を結合し、クエリで国コードのみを返すため、復号化を行うmysqlストアド関数を作成しようとしています。

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

(ヒントから完全な機能に至るまで)どんな助けもいただければ幸いです!

「MD5は復号化できません。ハッシュです!」などのコメント 高く評価されません。

4

2 に答える 2

0

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

他のすべての操作は可逆的です(文字列のパディング、パッキング、XOR [ ^])

MySQL機能に関しては、私はしません。IMHOのより良い解決策は、country_from_ip既存のすべてのIPを復号化し、国コードを取得し、新しいレコードを保存しながらこの情報を追加するようにphpコードを変更することにより、列を使用してユーザーテーブルを拡張し、phpからデータを入力することです。

関数によって計算されたフィールドに結合することは、すぐにアプリケーションのボトルネックになります

于 2012-01-14T09:15:54.283 に答える
0

MD5ハッシュはIPアドレスでは実行されません。暗号化などに、ランダムシードデータを追加するために使用されているようです。

復号化する方法として、なぜSQLを使いたいのですか?おそらく可能ですが、このタイプの操作ではPHPの方がはるかに高速であると思います。

たとえば、SQLを使用して一度に1000のユーザー行を選択し、PHPを使用してそれらを各国に対して実際にリンクします。

于 2012-01-14T09:22:38.860 に答える