Cifrado de contraseñas

De WikiEducator
Saltar a: navegación, buscar


Funciones de cifrado

Icon objectives.jpg

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

Icon objectives.jpg

Cifrado con pbkdf2

Icon present.gif
Tip: 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);



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



Práctica. Adaptación de un registro de usuarios

Icon activity.jpg

Práctica. Adaptación de un registro de usuarios

Echa un vistazo a http://www.php-login.net/

  1. 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/
  2. Adapta el sistema de login de https://github.com/panique/php-login-minimal a tu agenda con PDO y sqlite