La forma más fácil de asegurar su esquema de almacenamiento de contraseña es mediante el uso de una biblioteca estándar .
Debido a que la seguridad tiende a ser mucho más complicada y con más posibilidades invisibles de arruinar que la mayoría de los programadores podrían enfrentar solos, usar una biblioteca estándar es casi siempre la opción más fácil y segura (si no la única) disponible.
La nueva API de contraseña PHP (5.5.0+)
Si está utilizando PHP versión 5.5.0 o posterior, puede utilizar la nueva API simplificada de hashing de contraseñas
Ejemplo de código usando la API de contraseña de PHP:
<?php
// $hash is what you would store in your database
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT, ['cost' => 12]);
// $hash would be the $hash (above) stored in your database for this user
$checked = password_verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
(En caso de que todavía esté utilizando el legado 5.3.7 o posterior, puede instalar ircmaxell / password_compat para tener acceso a las funciones integradas)
Mejora en hash salados: agregue pimienta
Si desea seguridad adicional, la gente de seguridad ahora (2017) recomienda agregar un ' pimiento ' a los hashes de contraseña (automáticamente) salados.
Hay una caída simple en la clase que implementa de manera segura este patrón, recomiendo:
Netsilik / PepperedPasswords
( github ).
Viene con una licencia MIT, por lo que puede usarla como quiera, incluso en proyectos propietarios.
Ejemplo de código usando Netsilik/PepperedPasswords
:
<?php
use Netsilik/Lib/PepperedPasswords;
// Some long, random, binary string, encoded as hexadecimal; stored in your configuration (NOT in your Database, as that would defeat the entire purpose of the pepper).
$config['pepper'] = hex2bin('012345679ABCDEF012345679ABCDEF012345679ABCDEF012345679ABCDEF');
$hasher = new PepperedPasswords($config['pepper']);
// $hash is what you would store in your database
$hash = $hasher->hash($_POST['password']);
// $hash would be the $hash (above) stored in your database for this user
$checked = $hasher->verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
La biblioteca estándar ANTIGUA
Tenga en cuenta: ¡ ya no debería necesitar esto! Esto es solo aquí para fines históricos.
Eche un vistazo a: Marco de hash de contraseña PHP portátil : phpass y asegúrese de usar el CRYPT_BLOWFISH
algoritmo si es posible.
Ejemplo de código usando phpass (v0.2):
<?php
require('PasswordHash.php');
$pwdHasher = new PasswordHash(8, FALSE);
// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );
// $hash would be the $hash (above) stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
PHPass se ha implementado en algunos proyectos bastante conocidos:
- phpBB3
- WordPress 2.5+ y bbPress
- la versión Drupal 7 (módulo disponible para Drupal 5 y 6)
- otros
Lo bueno es que no necesita preocuparse por los detalles, esos detalles han sido programados por personas con experiencia y revisados por muchas personas en Internet.
Para obtener más información sobre los esquemas de almacenamiento de contraseñas, lea la publicación del blog de Jeff : Probablemente esté almacenando contraseñas incorrectamente
Hagas lo que hagas si eliges el enfoque ' Lo haré yo mismo, gracias ', no lo uses MD5
ni SHA1
más . Son buenos algoritmos de hash, pero se consideran rotos por motivos de seguridad .
Actualmente, usar crypt , con CRYPT_BLOWFISH es la mejor práctica.
CRYPT_BLOWFISH en PHP es una implementación del hash Bcrypt. Bcrypt se basa en el cifrado de bloques Blowfish, haciendo uso de su costosa configuración de teclas para ralentizar el algoritmo.