Entonces, ¿quieres usar bcrypt? ¡Increíble! Sin embargo, al igual que otras áreas de la criptografía, no debería hacerlo usted mismo. Si necesita preocuparse por algo como administrar claves, almacenar sales o generar números aleatorios, lo está haciendo mal.
La razón es simple: es tan trivialmente fácil fastidiar bcrypt . De hecho, si observa casi todos los códigos de esta página, notará que está violando al menos uno de estos problemas comunes.
Acéptalo, la criptografía es difícil.
Déjalo para los expertos. Déjelo a las personas cuyo trabajo es mantener estas bibliotecas. Si necesita tomar una decisión, lo está haciendo mal.
En cambio, solo usa una biblioteca. Existen varios según sus requisitos.
Bibliotecas
Aquí hay un desglose de algunas de las API más comunes.
PHP 5.5 API - (Disponible para 5.3.7+)
A partir de PHP 5.5, se está introduciendo una nueva API para contraseñas hash. También hay una biblioteca de compatibilidad de shim mantenida (por mí) para 5.3.7+. Esto tiene el beneficio de ser una implementación revisada por pares y fácil de usar.
function register($username, $password) {
$hash = password_hash($password, PASSWORD_BCRYPT);
save($username, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
if (password_verify($password, $hash)) {
//login
} else {
// failure
}
}
Realmente, pretende ser extremadamente simple.
Recursos:
Zend \ Crypt \ Password \ Bcrypt (5.3.2+)
Esta es otra API que es similar a la de PHP 5.5 y tiene un propósito similar.
function register($username, $password) {
$bcrypt = new Zend\Crypt\Password\Bcrypt();
$hash = $bcrypt->create($password);
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$bcrypt = new Zend\Crypt\Password\Bcrypt();
if ($bcrypt->verify($password, $hash)) {
//login
} else {
// failure
}
}
Recursos:
PasswordLib
Este es un enfoque ligeramente diferente para el hashing de contraseñas. En lugar de simplemente admitir bcrypt, PasswordLib admite una gran cantidad de algoritmos de hash. Es principalmente útil en contextos en los que necesita compatibilidad con sistemas heredados y dispares que pueden estar fuera de su control. Es compatible con una gran cantidad de algoritmos de hash. Y es compatible con 5.3.2+
function register($username, $password) {
$lib = new PasswordLib\PasswordLib();
$hash = $lib->createPasswordHash($password, '$2y$', array('cost' => 12));
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$lib = new PasswordLib\PasswordLib();
if ($lib->verifyPasswordHash($password, $hash)) {
//login
} else {
// failure
}
}
Referencias
- Código fuente / documentación: GitHub
PHPASS
Esta es una capa que admite bcrypt, pero también admite un algoritmo bastante fuerte que es útil si no tiene acceso a PHP> = 5.3.2 ... En realidad, admite PHP 3.0+ (aunque no con bcrypt).
function register($username, $password) {
$phpass = new PasswordHash(12, false);
$hash = $phpass->HashPassword($password);
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$phpass = new PasswordHash(12, false);
if ($phpass->CheckPassword($password, $hash)) {
//login
} else {
// failure
}
}
Recursos
Nota: ¡No use las alternativas PHPASS que no están alojadas en openwall, son proyectos diferentes!
Sobre BCrypt
Si observa, cada una de estas bibliotecas devuelve una sola cadena. Eso se debe a cómo BCrypt funciona internamente. Y hay MUCHAS respuestas sobre eso. Aquí hay una selección que he escrito, que no copiaré / pegaré aquí, pero enlace a:
Envolver
Hay muchas opciones diferentes. Lo que elijas depende de ti. Sin embargo, recomiendo encarecidamente que utilice una de las bibliotecas anteriores para manejar esto por usted.
Nuevamente, si está usando crypt()
directamente, probablemente esté haciendo algo mal. Si su código está usando hash()
(o md5()
o sha1()
) directamente, casi definitivamente está haciendo algo mal.
Solo usa una biblioteca ...