15

PHP には md5()、sha1()、および hash() 関数があることは知っていますが、MySQL PASSWORD() 関数を使用してハッシュを作成したいと考えています。これまでのところ、私が考えることができる唯一の方法は、サーバーにクエリを実行することですが、MySQL にまったくクエリを実行せずに同じことを行う関数 (できれば php または Perl) が必要です。

例えば:

MySQL ハッシュ -> 464bb2cb3cf18b66

MySQL5 ハッシュ -> *01D01F5CA7CA8BA771E03F4AC55EC73C11EFA229

ありがとう!

4

7 に答える 7

27

私はもともと、2 つの MySQL パスワード ハッシュ関数の PHP 実装を探していたときに、この質問に出くわしました。実装を見つけることができなかったので、MySQL ソース コード (sql/password.c) から独自のものを採用しました。以下は PHP 5.2 でテストされ、動作しています。

// The following is free for any use provided credit is given where due.
// This code comes with NO WARRANTY of any kind, including any implied warranty.

/**
 * MySQL "OLD_PASSWORD()" AKA MySQL323 HASH FUNCTION
 * This is the password hashing function used in MySQL prior to version 4.1.1
 * By Defines Fineout 10/9/2009 9:12:16 AM
**/
function mysql_old_password_hash($input, $hex = true)
{
  $nr = 1345345333; $add = 7; $nr2 = 0x12345671; $tmp = null;
  $inlen = strlen($input);
  for ($i = 0; $i < $inlen; $i++) {
    $byte = substr($input, $i, 1);
    if ($byte == ' ' || $byte == "\t") continue;
    $tmp = ord($byte);
    $nr ^= ((($nr & 63) + $add) * $tmp) + (($nr << 8) & 0xFFFFFFFF);
    $nr2 += (($nr2 << 8) & 0xFFFFFFFF) ^ $nr;
    $add += $tmp;
  }
  $out_a = $nr & ((1 << 31) - 1);
  $out_b = $nr2 & ((1 << 31) - 1);
  $output = sprintf("%08x%08x", $out_a, $out_b);
  if ($hex) return $output;
  return hex_hash_to_bin($output);
} //END function mysql_old_password_hash

/**
 * MySQL "PASSWORD()" AKA MySQLSHA1 HASH FUNCTION
 * This is the password hashing function used in MySQL since version 4.1.1
 * By Defines Fineout 10/9/2009 9:36:20 AM
**/
function mysql_password_hash($input, $hex = true)
{
  $sha1_stage1 = sha1($input, true);
  $output = sha1($sha1_stage1, !$hex);
  return $output;
} //END function mysql_password_hash

/**
 * Computes each hexidecimal pair into the corresponding binary octet.
 * Similar to mysql hex2octet function.
**/
function hex_hash_to_bin($hex)
{
  $bin = "";
  $len = strlen($hex);
  for ($i = 0; $i < $len; $i += 2) {
    $byte_hex = substr($hex, $i, 2);
    $byte_dec = hexdec($byte_hex);
    $byte_char = chr($byte_dec);
    $bin .= $byte_char;
  }
  return $bin;
} //END function hex_hash_to_bin

うまくいけば、他の誰かもこれが役立つと思うでしょう:)

于 2009-10-09T13:45:13.430 に答える
17

この関数のアルゴリズムに興味がある場合は、ソース コードをダウンロードしてファイル sql/password.c を参照するか、この実装を確認してください。

于 2008-11-03T23:06:26.790 に答える
5

はい、遅すぎますが、私はそのページでこの実装を思いついたばかりです:http: //dev.mysql.com/doc/refman/5.1/en/password-hashing.html

これは、mysqlパスワードと同等のphp関数です。

function mysql_41_password($in) {
    $p = sha1($in, true);
    $p = sha1($p);
    return '*'. strtoupper($p);
} 
于 2011-12-26T10:00:53.180 に答える
4

なぜ mysql password() 関数を使用したいのですか? Mysql のドキュメントでさえ、これに対して次のようにアドバイスしています。

http://dev.mysql.com/doc/refman/5.0/en/encryption-functions.html#function_password

PASSWORD() 関数は、MySQL Server の認証システムによって使用されます。独自のアプリケーションで使用しないでください

たとえば、md5() を使用できます。これは、ほぼすべてのプログラミング言語 (php および perl を含む) に存在します。

于 2008-11-03T23:04:53.050 に答える
1

不良少年は sha1sum を使用して bash でそれを行います ;)

PHRASE="password"; P1=`echo -n "${PHRASE}"|sha1sum`; P2="*`echo -en $(echo -n ${P1%% *}|sed -E 's/([0-9a-f]{2})/\\\x\1/g')|sha1sum -b`"; PASS="${P2%% *}"; echo "${PASS^^}"

OT、とにかく... :)

于 2012-02-09T09:58:50.177 に答える
1

上記の PHP 実装に基づいて、動作する Perl の例を次に示します。

use Digest::SHA1 qw(sha1 sha1_hex);
sub password { "*".uc(sha1_hex(sha1($_[0]))) }

パスワード関数は、MySQL5 PASSWORD() 関数と同じものを返します。

「なぜこれをやりたいのか?」に対する答えとして、私はそれを使用して、プレーンテキストのパスワードを含まない SQL の「CREATE USER」ステートメントを生成します。

于 2011-04-07T05:23:02.697 に答える