2008-11-03 21 views
12

Wiem, że php ma funkcje md5(), sha1() i hash(), ale chcę utworzyć skrót za pomocą funkcji PASSWORD() MySQL. Do tej pory jedyny sposób, jaki mogę wymyślić, to po prostu zapytać serwer, ale chcę mieć funkcję (najlepiej w php lub Perlu), która zrobi to samo, bez wysyłania zapytania do MySQL.Implementacja funkcji Hashing MySQL

Na przykład:

MySQL hash -> 464bb2cb3cf18b66

MySQL5 hash -> * 01D01F5CA7CA8BA771E03F4AC55EC73C11EFA229

Dzięki!

+0

ja nie rozumiem. Chcesz użyć funkcji PASSWORD MySQL, ale w Perlu/php? Jaki jest sens? – JesperE

+0

Chodzi o to, że prawdopodobnie chce spróbować włamać się do serwera mysql, i jakoś udało się zeskładać kody hashowe, więc próbuje użyć crackera, by odzyskać oryginały. – Zak

+3

Dlaczego to ma znaczenie? To proste pytanie. Chciałbym również zobaczyć implementację każdej z funkcji hasła MySQL w PHP. – defines

Odpowiedz

4

Dlaczego chcesz używać funkcji hasła mysql()? Nawet dokumentacji MySQL odradza to:

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

Funkcja PASSWORD() jest używana przez system uwierzytelniania w serwerze MySQL; nie powinieneś używać go we własnych aplikacjach.

Możesz użyć md5() na przykład, który jest obecny w prawie każdym języku programowania, włącznie z php i perl.

+1

MD5 został uszkodzony. Tak ma SHA1. NIST zaleca stosowanie funkcji rodziny SHA-2, takich jak SHA224, SHA256, SHA384 lub SHA512. http://csrc.nist.gov/groups/ST/toolkit/secure_hashing.html – jakber

+1

Rozrusznik nici chciał utworzyć skrót, i nie powiedział, że użyje go do przechowywania haseł, więc nie miałem nic przeciwko siła algorytmu md5. –

+5

Dlaczego dbasz o to, do czego on służy? Nie powiedział, że używał go w aplikacji i wyraźnie stwierdził, że nie chce używać MD5. –

16

Jeśli interesuje Cię algorytm tej funkcji, pobierz kod źródłowy i zobacz plik sql/password.c lub sprawdź implementację this.

+2

Nie wiem, dlaczego nie zostałeś poddany pod głosowanie więcej, jesteś jedynym w wątku, który faktycznie odpowiedział na pytanie chłopaków ... idź! –

+1

Rzeczywiście. Ja też przyszedłem tutaj, szukając właściwego algorytmu. Nie ma go w dokumentacji MySQL. Dzięki CMS. – Omniwombat

+0

nie masz kodu do php –

25

Pierwotnie natknąłem się na to pytanie we własnych poszukiwaniach implementacji PHP dwóch funkcji haszowania hasłem MySQL. Nie mogłem znaleźć żadnych implementacji, więc zaadaptowałem własne z kodu źródłowego MySQL (sql/password.c). Poniższy są testowane i działa w 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 

Mam nadzieję, że ktoś znajdzie to użyteczne, jak również :)

+1

Działa idealnie! Dobra implementacja php. –

+1

Miałem problemy na starym serwerze linuksowym z PHP 5.1.6, wyśledziłem problem ((1 << 31) - 1) obliczając na 0x80000000 zamiast 0x7FFFFFFF. Nie zawracałem sobie głowy badaniem, czy jest to błąd 5.1 czy coś innego. Niezależnie od tego zastąpiłem $ out_a i $ out_b assignments i działałem jak czar. Dzięki! – Pete

+0

Tak, to jest błąd specyficzny dla wersji z przepełnieniem całkowitym z tego, co mogę powiedzieć. – defines

1

podstawie realizacji PHP powyżej, oto przykład Perl, który działa.

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

Funkcja hasła zwraca tę samą funkcję co funkcja MySQL5 PASSWORD().

W odpowiedzi na pytanie "dlaczego ktoś chciałby to zrobić?", Używam go do generowania instrukcji SQL "CREATE USER", które nie zawierają zwykłego tekstu.

1

Bad boys zrobić w bash z 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, ale i tak ... :)

Powiązane problemy