Actualmente estoy trabajando en una "función de ayuda" para el núcleo de PHP para que la creación de contraseñas sea más segura y más fácil para la mayoría de los desarrolladores. Básicamente, el objetivo es hacerlo tan fácil, que sea más difícil inventar su propia implementación que usar la principal segura. También está diseñado para actualizarse y ampliarse en el futuro a medida que mejoren los métodos de hash.
He escrito un RFC para la adición , y tengo un implementación de las funciones también.
La premisa básica es que crypt
es demasiado difícil de usar directamente para la mayoría de los desarrolladores. Los errores extraños devuelven, las sales de base64-like (pero usando un alfabeto diferente), etc. Así que estas funciones están diseñadas para eliminar esas conjeturas y proporcionar una API muy simple.
string password_hash(string $password, string $algo = PASSWORD_DEFAULT, array $options = array())
bool password_verify(string $password, string $hash)
string password_make_salt(int $length, bool $raw_output = false)
Password_Hash toma una contraseña, un especificador de algoritmo opcional (en este momento, solo se admite la implementación mejorada de CRYPT_BCRYPT
, pero me gustaría agregar scrypt
como una opción más adelante) y una matriz de opciones. La matriz de opciones puede especificar el parámetro cost
para bcrypt, así como un valor de sal predefinido.
Password_Verify acepta una contraseña y un hash existente. Luego vuelve a escribir la contraseña (idéntica a $tmp = crypt($password, $hash)
). Luego, utiliza una función de comparación de tiempo constante para determinar si los dos hashes son iguales.
Password_Make_Salt existe para generar una cadena aleatoria de la longitud dada. Si raw_output
se establece en falso (predeterminado), el "salt" generado será codificado en base64 de una manera que sea directamente compatible con crypt()
. Si raw_output
es verdadero, devolverá la misma cadena de longitud utilizando bytes completos aleatorios ( 0-255
).
Ejemplo:
$hash = password_hash("foo");
if (password_verify("foo", $hash)) {
// always should be true
} else {
}
Una nota sobre la lectura del código fuente de PHP: las funciones de PHP (aquellas expuestas al código php) están rodeadas por la macro PHP_FUNCTION()
. Además, las variables php (zval's) se utilizan en algunos lugares. Las macros que acceden a partes de ellas son
-
Z_TYPE_P()
(encontrar el tipo de un puntero a un zval) -
Z_STRVAL_P()
(obtener el puntero al valor de cadena) -
Z_STRLEN_P()
(obtenga la longitudint
del tipo de cadena) -
Z_LVAL_P()
(obtenga el valorlong
del tipo entero)
Además, zval_ptr_dtor()
es un mecanismo de refcount para disminuir el refcount en un zval
, y limpiarlo si llega a 0
.
Estoy buscando una revisión de la implementación por parte de al menos algunos expertos en seguridad antes de proponer oficialmente el cambio. Es razonablemente corto (solo unas 300 líneas de código) ...
Actualizar
La API ha sido aprobada, por lo que he configurado una solicitud de extracción para la funcionalidad. Por favor revísalo si tienes tiempo. ¡Gracias !: enlace