Diferencia entre revisiones de «Usuario:Lmorillas/desarrollo web servidor/php/passwords»
De WikiEducator
(9 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 3: | Línea 3: | ||
{{Objetivo|1= | {{Objetivo|1= | ||
PHP >= 5.5 | PHP >= 5.5 | ||
+ | <source lang="php"> | ||
$hashed_password = password_hash("mipassword", PASSWORD_DEFAULT) | $hashed_password = password_hash("mipassword", PASSWORD_DEFAULT) | ||
boolean password_verify ( string $password , string $hash ) | boolean password_verify ( string $password , string $hash ) | ||
+ | </source> | ||
Todos | Todos | ||
− | $ | + | <source lang="php"> |
− | + | // 2a es el selector del algoritmo bcrypt algoritmo (ver http://php.net/crypt) | |
+ | // 12 es el factor de carga de trabajo (unos 300ms en un Core i7), ver http://php.net/crypt | ||
+ | $salt = bin2hex(openssl_random_pseudo_bytes(22)); | ||
+ | $passwd = filter_var($_POST['password'), FILTER_SANITIZE_STRING); | ||
+ | $hash = crypt($passwd, "$2a$12$".$salt); | ||
+ | // Guarda el hash, no hace falta guardar el salt | ||
+ | if (crypt($passwd, $hash) == $hash) { | ||
+ | // Verificado | ||
+ | } | ||
+ | </source> | ||
* http://es1.php.net/manual/en/function.password-hash.php | * http://es1.php.net/manual/en/function.password-hash.php | ||
* http://es1.php.net/manual/en/function.password-verify.php | * http://es1.php.net/manual/en/function.password-verify.php | ||
* http://es1.php.net/manual/en/function.crypt.php | * http://es1.php.net/manual/en/function.crypt.php | ||
− | + | |TOCdepth=2 | |
|Title=Funciones de cifrado}} | |Title=Funciones de cifrado}} | ||
+ | |||
+ | {{Objetivo| | ||
+ | * https://defuse.ca/php-pbkdf2.htm | ||
+ | * https://crackstation.net/hashing-security.htm | ||
+ | |||
+ | {{Tip|1=Para crear passwords compatibles con django | ||
+ | * Usa un formato similar a: | ||
+ | pbkdf2_sha256$12000$ZfzXP1CSsmRt$zDNHbP9G7raLL4VklshS7hBnjEw6tIN0PbdENhNzCdQ= | ||
+ | ** sustituye el algoritmo por '''pbkdf2_sha256''' | ||
+ | ** usa como separador '''$''' | ||
+ | * Configura: | ||
+ | define("PBKDF2_ITERATIONS", 12000); | ||
+ | define("PBKDF2_SALT_BYTE_SIZE", 8); | ||
+ | define("PBKDF2_HASH_BYTE_SIZE", 32); | ||
+ | }} | ||
+ | |Title=Cifrado con pbkdf2 | ||
+ | |TOCdepth=2 | ||
+ | }} | ||
{{Objetivo| | {{Objetivo| | ||
Línea 22: | Línea 51: | ||
* https://github.com/panique/php-login-one-file | * https://github.com/panique/php-login-one-file | ||
− | + | |TOCdepth=2 | |
|Title=Tutoriales}} | |Title=Tutoriales}} | ||
+ | == Problema mcrypt en ubuntu == | ||
+ | sudo ln -s /etc/php5/conf.d/mcrypt.ini /etc/php5/mods-available | ||
+ | sudo php5enmod mcrypt | ||
+ | sudo service apache2 restart | ||
+ | |||
+ | == Otros ejemplos de cifrado de contraseñas == | ||
+ | <source lang="php"> | ||
+ | <?php | ||
+ | $username = $_POST["username"]; | ||
+ | $password = $_POST["password"]; | ||
+ | |||
+ | // conexión a la base de datos | ||
+ | // ... | ||
+ | |||
+ | // limpieza de los inputs | ||
+ | // ... | ||
+ | |||
+ | // crear hash de la password | ||
+ | $password = hash("sha256", $password); | ||
+ | |||
+ | |||
+ | // guardar valores en la base de datos | ||
+ | $sql = "INSERT INTO users (username, password) VALUES (:username, :password)"; | ||
+ | |||
+ | $stmt = $db->prepare($sql); | ||
+ | |||
+ | $stmt->execute(array( | ||
+ | ":username" => $username, | ||
+ | ":password" => $password | ||
+ | )); | ||
+ | </source> | ||
+ | |||
+ | === con salt === | ||
+ | <source lang="php"> | ||
+ | <?php | ||
+ | define("MAX_LENGTH", 6); | ||
+ | |||
+ | function generateHashWithSalt($password) { | ||
+ | $intermediateSalt = md5(uniqid(rand(), true)); | ||
+ | $salt = substr($intermediateSalt, 0, MAX_LENGTH); | ||
+ | return hash("sha256", $password . $salt); | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | === Uso de Bcrypt === | ||
+ | <source lang="php"> | ||
+ | <?php | ||
+ | function generateHash($password) { | ||
+ | if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) { | ||
+ | $salt = '$2y$11$' . substr(md5(uniqid(rand(), true)), 0, 22); | ||
+ | return crypt($password, $salt); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | === Autentificar usuarios === | ||
+ | <source lang="php"> | ||
+ | <?php | ||
+ | function verificar($password, $hashedPassword) { | ||
+ | return crypt($password, $hashedPassword) == $hashedPassword; | ||
+ | } | ||
+ | </source> | ||
{{Actividad| | {{Actividad| | ||
− | + | Realiza las dos actividades de registro de usuarios siguientes: | |
+ | * http://www.mclibre.org/consultar/php/ejercicios/nivel_medio/registro_de_usuarios_1.html | ||
+ | * http://www.mclibre.org/consultar/php/ejercicios/nivel_medio/registro_usuarios.html | ||
+ | |TOCdepth=2 | ||
+ | |Title=Práctica de registro de usuarios | ||
+ | }} | ||
− | Adapta el sistema de login de https://github.com/panique/php-login-minimal a tu agenda con PDO y sqlite | + | {{Actividad| |
+ | Echa un vistazo a http://www.php-login.net/ | ||
+ | # Crea una app de prueba que use el login-advanced (https://github.com/panique/php-login-advanced) Tutorial: http://www.dev-metal.com/install-php-login-nets-2-advanced-login-script-ubuntu/ | ||
+ | # Adapta el sistema de login de https://github.com/panique/php-login-minimal a tu agenda con PDO y sqlite | ||
+ | |TOCdepth=2 | ||
+ | |Title=Práctica. Adaptación de un registro de usuarios | ||
}} | }} |
Última revisión de 05:08 6 feb 2014
Contenido
Funciones de cifrado
PHP >= 5.5
$hashed_password = password_hash("mipassword", PASSWORD_DEFAULT) boolean password_verify ( string $password , string $hash ) Todos // 2a es el selector del algoritmo bcrypt algoritmo (ver http://php.net/crypt) // 12 es el factor de carga de trabajo (unos 300ms en un Core i7), ver http://php.net/crypt $salt = bin2hex(openssl_random_pseudo_bytes(22)); $passwd = filter_var($_POST['password'), FILTER_SANITIZE_STRING); $hash = crypt($passwd, "$2a$12$".$salt); // Guarda el hash, no hace falta guardar el salt if (crypt($passwd, $hash) == $hash) { // Verificado } |
Cifrado con pbkdf2
Tip: Para crear passwords compatibles con django
pbkdf2_sha256$12000$ZfzXP1CSsmRt$zDNHbP9G7raLL4VklshS7hBnjEw6tIN0PbdENhNzCdQ=
define("PBKDF2_ITERATIONS", 12000); define("PBKDF2_SALT_BYTE_SIZE", 8); define("PBKDF2_HASH_BYTE_SIZE", 32);
|
Tutoriales
Problema mcrypt en ubuntu
sudo ln -s /etc/php5/conf.d/mcrypt.ini /etc/php5/mods-available sudo php5enmod mcrypt sudo service apache2 restart
Otros ejemplos de cifrado de contraseñas
<?php $username = $_POST["username"]; $password = $_POST["password"]; // conexión a la base de datos // ... // limpieza de los inputs // ... // crear hash de la password $password = hash("sha256", $password); // guardar valores en la base de datos $sql = "INSERT INTO users (username, password) VALUES (:username, :password)"; $stmt = $db->prepare($sql); $stmt->execute(array( ":username" => $username, ":password" => $password ));
con salt
<?php define("MAX_LENGTH", 6); function generateHashWithSalt($password) { $intermediateSalt = md5(uniqid(rand(), true)); $salt = substr($intermediateSalt, 0, MAX_LENGTH); return hash("sha256", $password . $salt); }
Uso de Bcrypt
<?php function generateHash($password) { if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) { $salt = '$2y$11$' . substr(md5(uniqid(rand(), true)), 0, 22); return crypt($password, $salt); } }
Autentificar usuarios
<?php function verificar($password, $hashedPassword) { return crypt($password, $hashedPassword) == $hashedPassword; }
Práctica de registro de usuarios
Realiza las dos actividades de registro de usuarios siguientes:
|
Práctica. Adaptación de un registro de usuarios
Echa un vistazo a http://www.php-login.net/
|