2008-11-03 55 views
12

Tôi biết rằng php có các hàm md5(), sha1() và hash(), nhưng tôi muốn tạo một hàm băm bằng cách sử dụng hàm MySQL PASSWORD(). Cho đến nay, cách duy nhất tôi có thể nghĩ là chỉ cần truy vấn máy chủ, nhưng tôi muốn có một chức năng (tốt nhất là trong php hoặc Perl) sẽ làm điều tương tự mà không cần truy vấn MySQL chút nào.Thực hiện Chức năng Hashing MySQL

Ví dụ:

MySQL băm -> 464bb2cb3cf18b66

MySQL5 băm -> * 01D01F5CA7CA8BA771E03F4AC55EC73C11EFA229

Cảm ơn!

+0

Tôi không nhận được nó. Bạn muốn sử dụng hàm PASSWORD của MySQL, nhưng trong Perl/php? Vấn đề ở đây là gì? – JesperE

+0

Vấn đề là anh ta có thể muốn thử hack vào một máy chủ mysql, và bằng cách nào đó đã có kết xuất hashcodes, vì vậy anh ta đang cố gắng sử dụng một cracker mật khẩu để lấy lại bản gốc. – Zak

+3

Tại sao vấn đề lại quan trọng? Đó là một câu hỏi đơn giản. Tôi cũng muốn thấy việc triển khai thực hiện từng hàm mật khẩu MySQL trong PHP. – defines

Trả lời

4

Tại sao bạn muốn sử dụng hàm mysql password()? Ngay cả những tài liệu Mysql khuyên chống lại điều này:

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

Các PASSWORD() chức năng được sử dụng bởi hệ thống xác thực trong MySQL Server; bạn không nên sử dụng nó trong các ứng dụng của riêng bạn

Bạn có thể sử dụng md5(), ví dụ, hiện diện trong hầu hết mọi ngôn ngữ lập trình, php và perl.

+1

MD5 đã bị hỏng. Vì vậy, có SHA1. NIST khuyến nghị sử dụng chức năng gia đình SHA-2 như SHA224, SHA256, SHA384 hoặc SHA512. http://csrc.nist.gov/groups/ST/toolkit/secure_hashing.html – jakber

+1

Trình khởi chạy chỉ muốn tạo băm và không cho biết anh ta sẽ sử dụng nó để lưu trữ mật khẩu, vì vậy tôi không quan tâm đến sức mạnh của thuật toán md5. –

+5

Tại sao bạn quan tâm những gì anh ta muốn chức năng? Anh ta không nói anh ta đang sử dụng nó trong một ứng dụng, và cụ thể là anh ta không muốn sử dụng MD5. –

16

Nếu bạn quan tâm đến thuật toán của hàm này, hãy tải xuống mã nguồn và xem tệp sql/password.c hoặc kiểm tra triển khai this.

+2

Tôi không biết tại sao bạn không được bầu chọn nhiều hơn nữa, bạn là người duy nhất trong chủ đề thực sự trả lời câu hỏi của kẻ ... đi bạn! –

+1

Thật vậy. Tôi cũng đến đây tìm kiếm thuật toán thực tế. Nó không có trong tài liệu MySQL. Cảm ơn CMS. – Omniwombat

+0

bạn không có mã cho php –

25

Tôi ban đầu tình cờ gặp câu hỏi này trong tìm kiếm của riêng tôi về việc triển khai PHP của hai hàm băm mật khẩu MySQL. Tôi đã không thể tìm thấy bất kỳ triển khai, vì vậy tôi thích nghi của riêng tôi từ mã nguồn MySQL (sql/password.c). Sau đây là thử nghiệm và làm việc trong 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 Rev. Dustin 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 Rev. Dustin 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 

Hy vọng rằng ai đó sẽ tìm thấy điều này hữu ích cũng :)

+1

Hoạt động hoàn hảo! Đẹp php thực hiện. –

+1

Tôi đã có một số vấn đề trên một máy chủ Linux cũ chạy PHP 5.1.6, theo dõi vấn đề ((1 << 31) - 1) tính đến 0x80000000 thay vì 0x7FFFFFFF. Tôi không bận tâm nghiên cứu có hay không một lỗi 5.1 hoặc cái gì khác. Bất kể, tôi thay thế $ out_a và $ out_b bài tập và làm việc như một say mê. Cảm ơn! – Pete

+0

Đúng, đó là một lỗi phiên bản cụ thể với số nguyên tràn từ những gì tôi có thể nói. – defines

1

Dựa trên việc thực hiện PHP ở trên, đây là một ví dụ Perl mà làm việc.

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

Hàm mật khẩu trả về giống như hàm MySQL5 PASSWORD().

Trong câu trả lời cho "tại sao mọi người lại muốn làm điều này?", Tôi sử dụng nó để tạo câu lệnh SQL "CREATE USER" không chứa mật khẩu thuần văn bản.

5

Vâng, quá muộn nhưng tôi chỉ đưa ra thực hiện này trên trang đó: http://dev.mysql.com/doc/refman/5.1/en/password-hashing.html

Dưới đây là hàm php tương đương với mật khẩu mysql;

function mysql_41_password($in) { 
    $p = sha1($in, true); 
    $p = sha1($p); 
    return '*'. strtoupper($p); 
} 
1

trai Bad làm điều đó trong bash với sha1sum;)

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, nhưng dù sao ... :)

Các vấn đề liên quan