SlideShare una empresa de Scribd logo
1 de 13
Descargar para leer sin conexión
Meetups
@SergioCarracedoRoi Scroll CTO
Disfrutando del desarrollo web
desde 1998.
@rolando_caldas
https://rolandocaldas.com
Cuántas veces hemos visto crear hash “a lo loco”...
Meetups
<?php
$password = '123456';
$encryptedPassword = md5($password);
var_dump($encryptedPassword);
/*
string(32) "e10adc3949ba59abbe56e057f20f883e"
*/
… o alguna variante del estilo ...
Meetups
<?php
$password = '123456';
$salt = time();
$encryptedPassword = md5($password . $salt);
var_dump($encryptedPassword);
/*
string(32) "19d1a77319c0ca4dba950ff796849177"
*/
… hay quien se lo “curra” y usa sha1() ...
Meetups
<?php
$password = '123456';
$encryptedPassword = sha1($password);
var_dump($encryptedPassword);
/*
string(40)
"7c4a8d09ca3762af61e59520943dc26494f8941b"
*/
… con su respectiva variante ...
Meetups
<?php
$password = '123456';
$salt = time();
$encryptedPassword = sha1($password . $salt);
var_dump($encryptedPassword);
/*
string(40)
"445fa15513f8cb3d7983f3d2cff1092c3ab5f95a"
*/
El old-path para los hash en PHP es crypt()
Meetups
<?php
$password = '123456';
$salt =
'$2y$04$usesomesillystringfore7hnbRJHxXVLeakoG8K30oukPsA.ztMG';
$encryptedPassword = crypt($password, $salt);
var_dump($encryptedPassword);
/*
string(60)
"$2y$04$usesomesillystringforeQEfwKz1L9ksKh8.24s7LiFZFXDb9Ijq"
*/
“Problemas” del crypt()
Meetups
● Puedes usar métodos de encriptación poco seguros: md5, sha…
● Tienes que encargarte de generar un salt válido y fuerte.
● Puedes llamar a crypt() sin enviarle un salt… y generará uno DÉBIL.
● Existe la mala costumbre de validar el resultado comparando cadenas.
● Debes compararlo con hash_equals(), pero para eso necesitas almacenar el salt.
$en1 = crypt($password, $salt);
$en2 = crypt($password);
var_dump(hash_equals( $en1, $en2));
/* bool(false) */
$en1 = crypt($password, $salt);
$en2 = crypt($password, $salt );
var_dump(hash_equals( $en1, $en2));
/* bool(true) */
Welcome password_hash() !!
Meetups
● >= PHP 5.5.0
● Es un wrapper de crypt()
● Por defecto usa el algoritmo bcrypt
● Está preparado para cambiar en el futuro el algoritmo por defecto, sin que afecte a los hash ya
generados.
● Si no se le facilita un salt, genera uno SEGURO
● Desde PHP 7.0.0 pasarle el salt es una opción obsoleta.
● Por defecto, el coste del algoritmo es 10, pero se le puede pasar un valor mayor como opción.
● Se verifica de forma segura con password_verify()
● Con password_needs_rehash() podrás comprobar si existe un nuevo algoritmo de hash o ha
cambiado el coste, para así poder generar un nuevo hash para la misma contraseña.
Usando password_hash() y password_verify()
Meetups
<?php
$password = '123456';
$en = password_hash( $password,
PASSWORD_DEFAULT);
var_dump($en);
/*
string(60)
"$2y$10$IfVdG4RmbBWRHG.fm4hsGOOA6QB43ibh
2QQB1GA4wA10c0rNLWTSq"
*/
<?php
$password =
'$2y$10$IfVdG4RmbBWRHG.fm4hsGOOA6QB43ibh
2QQB1GA4wA10c0rNLWTSq' ;
var_dump(password_verify( '123456',
$password));
/*
bool(true)
*/
Ejemplo de Value Object con password_hash() y password_verify()
Meetups
<?php
namespace AppDomainValueObject ;
class Password
{
private $password;
public function __construct(string $password)
{
$this->validate($password);
$this->password = password_hash( $password, PASSWORD_DEFAULT);
}
Ejemplo de Value Object con password_hash() y password_verify()
Meetups
private function validate(string $password)
{
if (strlen($password) > 72) {
throw new Exception("The password exceeds the max. characters: 72" );
}
}
public function isEqualTo(string $password) : bool
{
return password_verify( $password, $this->password);
}
public function isNeedleRehash () : bool
{
return password_needs_rehash( $this->password ,PASSWORD_DEFAULT);
}
}
www.opsou.com www.pedrofigueras.com

Más contenido relacionado

Similar a PHPVigo #17 - lightning password hash

Criptografía en Webs 2.0
Criptografía en Webs 2.0Criptografía en Webs 2.0
Criptografía en Webs 2.0Dedalo-SB
 
Introducción a PHP - Programador PHP - UGR
Introducción a PHP - Programador PHP - UGRIntroducción a PHP - Programador PHP - UGR
Introducción a PHP - Programador PHP - UGRJuan Belón Pérez
 
The Original Hacker número 11.
The Original Hacker número 11.The Original Hacker número 11.
The Original Hacker número 11.Huehue 1
 
PHPVigo #19 - Lightning variables de entorno
PHPVigo #19 - Lightning variables de entornoPHPVigo #19 - Lightning variables de entorno
PHPVigo #19 - Lightning variables de entornoRolando Caldas
 
Lima hack 2011
Lima hack 2011Lima hack 2011
Lima hack 2011Dedalo-SB
 
José Ramón Palanco - NoSQL Security [RootedCON 2011]
José Ramón Palanco - NoSQL Security [RootedCON 2011]José Ramón Palanco - NoSQL Security [RootedCON 2011]
José Ramón Palanco - NoSQL Security [RootedCON 2011]RootedCON
 
Pablo Caro & Jaime Sánchez - I know your P4$$w0rd (and if I don’t, I will gue...
Pablo Caro & Jaime Sánchez - I know your P4$$w0rd (and if I don’t, I will gue...Pablo Caro & Jaime Sánchez - I know your P4$$w0rd (and if I don’t, I will gue...
Pablo Caro & Jaime Sánchez - I know your P4$$w0rd (and if I don’t, I will gue...RootedCON
 
I Know Your P4$$w0rd (And If I Don't, I Will Guess It...)
I Know Your P4$$w0rd (And If I Don't, I Will Guess It...)I Know Your P4$$w0rd (And If I Don't, I Will Guess It...)
I Know Your P4$$w0rd (And If I Don't, I Will Guess It...)Jaime Sánchez
 
Pen test: El arte de la guerra
Pen test: El arte de la guerraPen test: El arte de la guerra
Pen test: El arte de la guerraFutura Networks
 
Presentacion password cracking_madrid_2019
Presentacion password cracking_madrid_2019Presentacion password cracking_madrid_2019
Presentacion password cracking_madrid_2019Labs CSL
 
Quasi - Practicas de Programacion en C
Quasi - Practicas de Programacion en CQuasi - Practicas de Programacion en C
Quasi - Practicas de Programacion en Cdegarden
 
Algoritmos de clave secreta, privada o simetrica.
Algoritmos de clave secreta, privada o simetrica.Algoritmos de clave secreta, privada o simetrica.
Algoritmos de clave secreta, privada o simetrica.Miguel Mauri
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryJavier P.
 

Similar a PHPVigo #17 - lightning password hash (20)

Criptografía en Webs 2.0
Criptografía en Webs 2.0Criptografía en Webs 2.0
Criptografía en Webs 2.0
 
Introducción a PHP - Programador PHP - UGR
Introducción a PHP - Programador PHP - UGRIntroducción a PHP - Programador PHP - UGR
Introducción a PHP - Programador PHP - UGR
 
The Original Hacker número 11.
The Original Hacker número 11.The Original Hacker número 11.
The Original Hacker número 11.
 
PHPVigo #19 - Lightning variables de entorno
PHPVigo #19 - Lightning variables de entornoPHPVigo #19 - Lightning variables de entorno
PHPVigo #19 - Lightning variables de entorno
 
Script dofus
Script dofusScript dofus
Script dofus
 
Lima hack 2011
Lima hack 2011Lima hack 2011
Lima hack 2011
 
José Ramón Palanco - NoSQL Security [RootedCON 2011]
José Ramón Palanco - NoSQL Security [RootedCON 2011]José Ramón Palanco - NoSQL Security [RootedCON 2011]
José Ramón Palanco - NoSQL Security [RootedCON 2011]
 
Pablo Caro & Jaime Sánchez - I know your P4$$w0rd (and if I don’t, I will gue...
Pablo Caro & Jaime Sánchez - I know your P4$$w0rd (and if I don’t, I will gue...Pablo Caro & Jaime Sánchez - I know your P4$$w0rd (and if I don’t, I will gue...
Pablo Caro & Jaime Sánchez - I know your P4$$w0rd (and if I don’t, I will gue...
 
I Know Your P4$$w0rd (And If I Don't, I Will Guess It...)
I Know Your P4$$w0rd (And If I Don't, I Will Guess It...)I Know Your P4$$w0rd (And If I Don't, I Will Guess It...)
I Know Your P4$$w0rd (And If I Don't, I Will Guess It...)
 
Perl5 hashes
Perl5 hashesPerl5 hashes
Perl5 hashes
 
Autentificacion sql antonio_hermoso
Autentificacion sql antonio_hermosoAutentificacion sql antonio_hermoso
Autentificacion sql antonio_hermoso
 
Pen test: El arte de la guerra
Pen test: El arte de la guerraPen test: El arte de la guerra
Pen test: El arte de la guerra
 
Php!
Php!Php!
Php!
 
MODELO PASO DE MENSAJES
MODELO PASO DE MENSAJESMODELO PASO DE MENSAJES
MODELO PASO DE MENSAJES
 
Presentacion password cracking_madrid_2019
Presentacion password cracking_madrid_2019Presentacion password cracking_madrid_2019
Presentacion password cracking_madrid_2019
 
Quasi - Practicas de Programacion en C
Quasi - Practicas de Programacion en CQuasi - Practicas de Programacion en C
Quasi - Practicas de Programacion en C
 
Encriptacion hash
Encriptacion hashEncriptacion hash
Encriptacion hash
 
Introducción a la Criptografia
Introducción a la CriptografiaIntroducción a la Criptografia
Introducción a la Criptografia
 
Algoritmos de clave secreta, privada o simetrica.
Algoritmos de clave secreta, privada o simetrica.Algoritmos de clave secreta, privada o simetrica.
Algoritmos de clave secreta, privada o simetrica.
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQuery
 

PHPVigo #17 - lightning password hash

  • 1.
  • 2. Meetups @SergioCarracedoRoi Scroll CTO Disfrutando del desarrollo web desde 1998. @rolando_caldas https://rolandocaldas.com
  • 3. Cuántas veces hemos visto crear hash “a lo loco”... Meetups <?php $password = '123456'; $encryptedPassword = md5($password); var_dump($encryptedPassword); /* string(32) "e10adc3949ba59abbe56e057f20f883e" */
  • 4. … o alguna variante del estilo ... Meetups <?php $password = '123456'; $salt = time(); $encryptedPassword = md5($password . $salt); var_dump($encryptedPassword); /* string(32) "19d1a77319c0ca4dba950ff796849177" */
  • 5. … hay quien se lo “curra” y usa sha1() ... Meetups <?php $password = '123456'; $encryptedPassword = sha1($password); var_dump($encryptedPassword); /* string(40) "7c4a8d09ca3762af61e59520943dc26494f8941b" */
  • 6. … con su respectiva variante ... Meetups <?php $password = '123456'; $salt = time(); $encryptedPassword = sha1($password . $salt); var_dump($encryptedPassword); /* string(40) "445fa15513f8cb3d7983f3d2cff1092c3ab5f95a" */
  • 7. El old-path para los hash en PHP es crypt() Meetups <?php $password = '123456'; $salt = '$2y$04$usesomesillystringfore7hnbRJHxXVLeakoG8K30oukPsA.ztMG'; $encryptedPassword = crypt($password, $salt); var_dump($encryptedPassword); /* string(60) "$2y$04$usesomesillystringforeQEfwKz1L9ksKh8.24s7LiFZFXDb9Ijq" */
  • 8. “Problemas” del crypt() Meetups ● Puedes usar métodos de encriptación poco seguros: md5, sha… ● Tienes que encargarte de generar un salt válido y fuerte. ● Puedes llamar a crypt() sin enviarle un salt… y generará uno DÉBIL. ● Existe la mala costumbre de validar el resultado comparando cadenas. ● Debes compararlo con hash_equals(), pero para eso necesitas almacenar el salt. $en1 = crypt($password, $salt); $en2 = crypt($password); var_dump(hash_equals( $en1, $en2)); /* bool(false) */ $en1 = crypt($password, $salt); $en2 = crypt($password, $salt ); var_dump(hash_equals( $en1, $en2)); /* bool(true) */
  • 9. Welcome password_hash() !! Meetups ● >= PHP 5.5.0 ● Es un wrapper de crypt() ● Por defecto usa el algoritmo bcrypt ● Está preparado para cambiar en el futuro el algoritmo por defecto, sin que afecte a los hash ya generados. ● Si no se le facilita un salt, genera uno SEGURO ● Desde PHP 7.0.0 pasarle el salt es una opción obsoleta. ● Por defecto, el coste del algoritmo es 10, pero se le puede pasar un valor mayor como opción. ● Se verifica de forma segura con password_verify() ● Con password_needs_rehash() podrás comprobar si existe un nuevo algoritmo de hash o ha cambiado el coste, para así poder generar un nuevo hash para la misma contraseña.
  • 10. Usando password_hash() y password_verify() Meetups <?php $password = '123456'; $en = password_hash( $password, PASSWORD_DEFAULT); var_dump($en); /* string(60) "$2y$10$IfVdG4RmbBWRHG.fm4hsGOOA6QB43ibh 2QQB1GA4wA10c0rNLWTSq" */ <?php $password = '$2y$10$IfVdG4RmbBWRHG.fm4hsGOOA6QB43ibh 2QQB1GA4wA10c0rNLWTSq' ; var_dump(password_verify( '123456', $password)); /* bool(true) */
  • 11. Ejemplo de Value Object con password_hash() y password_verify() Meetups <?php namespace AppDomainValueObject ; class Password { private $password; public function __construct(string $password) { $this->validate($password); $this->password = password_hash( $password, PASSWORD_DEFAULT); }
  • 12. Ejemplo de Value Object con password_hash() y password_verify() Meetups private function validate(string $password) { if (strlen($password) > 72) { throw new Exception("The password exceeds the max. characters: 72" ); } } public function isEqualTo(string $password) : bool { return password_verify( $password, $this->password); } public function isNeedleRehash () : bool { return password_needs_rehash( $this->password ,PASSWORD_DEFAULT); } }