php - online - password_bcrypt
ImplementaciĆ³n de la funciĆ³n MySQL Hashing (6)
Sé que php tiene md5 (), sha1 (), y las funciones hash (), pero quiero crear un hash usando la función MySQL PASSWORD (). Hasta ahora, la única forma en que puedo pensar es en consultar el servidor, pero quiero una función (preferiblemente en php o Perl) que haga lo mismo sin consultar MySQL en absoluto.
Por ejemplo:
Hash MySQL -> 464bb2cb3cf18b66
Hash MySQL5 -> * 01D01F5CA7CA8BA771E03F4AC55EC73C11EFA229
¡Gracias!
Basado en la implementación de PHP anterior, aquí hay un ejemplo de Perl que funciona.
use Digest::SHA1 qw(sha1 sha1_hex);
sub password { "*".uc(sha1_hex(sha1($_[0]))) }
La función de contraseña devuelve lo mismo que la función MySQL5 PASSWORD ().
En respuesta a "¿por qué alguien querría hacer esto?", Lo uso para generar sentencias SQL "CREATE USER" que no contienen contraseñas de texto sin formato.
¿Por qué quieres usar la función mysql password ()? Incluso la documentación de Mysql desaconseja esto:
http://dev.mysql.com/doc/refman/5.0/en/encryption-functions.html#function_password
La función PASSWORD () es utilizada por el sistema de autenticación en MySQL Server; no deberías usarlo en tus propias aplicaciones
Puede usar md5 () por ejemplo, que está presente en casi todos los lenguajes de programación, php y perl incluidos.
Si está interesado en el algoritmo de esta función, descargue el código fuente y vea el archivo sql / password.c, o verifique esta implementación.
Originalmente me topé con esta pregunta en mi propia búsqueda de una implementación de PHP de las dos funciones de hash de contraseñas de MySQL. No pude encontrar ninguna implementación, así que adapté la mía del código fuente de MySQL (sql / password.c). Los siguientes son probados y funcionan en 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
Con suerte, alguien más encontrará esto útil también :)
Los chicos malos hacen eso en bash con 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, pero de todos modos ... :)
Sí, es demasiado tarde, pero acabo de presentar esta implementación en esa página: http://dev.mysql.com/doc/refman/5.1/en/password-hashing.html
Aquí está la función php equivalente a la contraseña de mysql;
function mysql_41_password($in) {
$p = sha1($in, true);
$p = sha1($p);
return ''*''. strtoupper($p);
}