online - Generación de contraseña Hash en PHP 5.5 y configuración de opción de costo
php bcrypt online (2)
Sé que PHP 5.5 está en alfa, pero esta clase que estoy haciendo solo se está creando con anticipación para utilizar su función de hash usando function_exists ().
Revisé la documentación de password_hash
. El tercer argumento es para $ options, que actualmente admite dos opciones, ''sal'' y ''costo''.
Enuncia lo siguiente:
costo, que denota el costo algorítmico que se debe utilizar. Se pueden encontrar ejemplos de estos valores en la página crypt ().
Cuando voy a la página crypt () la documentación que da es:
Blowfish hashing con una sal de la siguiente manera: "$ 2a $", "$ 2x $" o "$ 2y $", un parámetro de costo de dos dígitos, "$" y 22 dígitos del alfabeto "./0-9A-Za -z ". El uso de caracteres fuera de este rango en el salt hará que crypt () devuelva una cadena de longitud cero. El parámetro de costo de dos dígitos es el logaritmo base-2 del recuento de iteraciones para el algoritmo de hashing basado en Blowfish subyacente y debe estar en el rango 04-31; los valores fuera de este rango harán que crypt () falle. Las versiones de PHP anteriores a 5.3.7 solo admiten "$ 2a $" como el prefijo salt: PHP 5.3.7 introdujo los nuevos prefijos para corregir una debilidad de seguridad en la implementación de Blowfish. Consulte »este documento para obtener todos los detalles de la solución de seguridad, pero para resumir, los desarrolladores que solo buscan PHP 5.3.7 y versiones posteriores deben usar" $ 2y $ "en lugar de" $ 2a $ ".
Parece que no puedo envolver mi cabeza alrededor de esto. Dice que PHP 5.3.7 y versiones posteriores deben usar $ 2y $, pero ¿qué valor de costo utilizo para obtener esa opción y es la mejor opción para elegir? El ejemplo que proporcionan usa un valor de 7, pero de acuerdo con lo anterior, puede llegar hasta 31, ¿qué diferencia hace usar decir 4 en lugar de decir 31?
Descargo de responsabilidad: esto es con PHP 5.3.10 , pero parece que no es muy diferente de su descripción.
El costo se aplica al costo de cómputo. Cuando aumenta el valor del costo, se necesita más tiempo para cifrar la contraseña
function blowfish_salt($cost)
{
$chars = ''./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'';
$salt = sprintf(''$2y$%02d$'', $cost);
for ($i = 0; $i < 22; ++$i)
$salt .= $chars[rand(0,63)];
return $salt;
}
$password = ''My perfect password'';
$cost = $argv[1];
$salt = blowfish_salt($cost);
$hash = crypt($password, $salt);
Cuando ejecuto esto en mi (vieja) máquina como
php mycrypt.php 10
regresa inmediatamente (~ 0.2 seg), mientras que con
php mycrypt.php 16
se tarda unos 5,2 segundos.
La función password_hash()
es solo una envoltura alrededor de la función crypt()
, y facilitará su uso correcto. Se encarga de la generación de una sal aleatoria segura y proporciona buenos valores predeterminados.
La forma más fácil de usar esta función será:
$hash = password_hash($password, PASSWORD_DEFAULT);
Eso significa que, la función procesará la contraseña con BCrypt (algoritmo 2y
), generará un salt aleatorio y usará el costo predeterminado (en este momento es 10). Estos son buenos valores predeterminados, particularmente si no generaría la sal de los tuyos, es fácil cometer errores allí.
Si desea cambiar el parámetro de costo, puede hacerlo así:
$hash = password_hash($password, PASSWORD_BCRYPT, ["cost" => 11]);
Al aumentar el parámetro de costo en 1, se duplica el tiempo necesario para calcular el valor de hash. El parámetro de costo es el logaritmo (base-2) del recuento de iteraciones, que significa:
$iterations = 2 ^ $cost;
Editar:
Me faltó el punto, que quieres generar tu propia clase. Para la versión 5.3.7 y posterior de PHP, existe un paquete de compatibilidad , del mismo autor que realizó la función password_hash()
. Puede usar este código directamente o mirar la implementación bien diseñada. Para las versiones de PHP anteriores a 5.3.7, no hay soporte para crypt
con 2y
, el algoritmo BCrypt con reconocimiento de Unicode. En su lugar, puede utilizar 2a
, que es la mejor alternativa para versiones anteriores de PHP. Hice un example con muchos comentarios, tal vez usted también quiera verlo.
PS Las expresiones "sal" y "factor de costo" se usan correctamente en password_hash()
, aunque la función crypt () usa la palabra sal para todos los parámetros de crypt juntos, eso es un poco engañoso.