Diferencia entre revisiones de «Usuario:Lmorillas/desarrollo web servidor/php/passwords»

De WikiEducator
Saltar a: navegación, buscar
(Página creada con '{{MiTitulo|Cifrado de contraseñas}} {{Objetivo| $hashed_password = password_hash("mipassword", PASSWORD_DEFAULT) boolean password_verify ( string $password , string $hash …')
 
 
(12 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 
{{MiTitulo|Cifrado de contraseñas}}
 
{{MiTitulo|Cifrado de contraseñas}}
  
{{Objetivo|
+
{{Objetivo|1=
 +
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
 +
<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
  
   $hashed_password = crypt('mypassword');
+
   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 21: 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|
 +
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
 +
}}
  
 
{{Actividad|
 
{{Actividad|
Adapta el sistema de login de https://github.com/panique/php-login-minimal para adaptarlo a tu agenda con PDO y sqlite
+
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


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