SlideShare una empresa de Scribd logo
PHPVigo #17 - lightning password hash
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

PPTX
Desde el DVR hasta la cocina
PDF
PROBLEMAS.
PPTX
Conferencia Innovación en Técnicas de Ethical Hacking
PDF
Python Securidad and Criptografia
PDF
Lord Epsylon - XSSer: the cross site scripting framework [RootedCON 2012]
DOCX
Programa 14
PDF
Administración de llaves SSH para aplicaciones
PDF
Password cracking
Desde el DVR hasta la cocina
PROBLEMAS.
Conferencia Innovación en Técnicas de Ethical Hacking
Python Securidad and Criptografia
Lord Epsylon - XSSer: the cross site scripting framework [RootedCON 2012]
Programa 14
Administración de llaves SSH para aplicaciones
Password cracking

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

ODP
Criptografía en Webs 2.0
PDF
Introducción a PHP - Programador PHP - UGR
PDF
PHPVigo #19 - Lightning variables de entorno
TXT
PPTX
Lima hack 2011
PDF
José Ramón Palanco - NoSQL Security [RootedCON 2011]
PDF
Pablo Caro & Jaime Sánchez - I know your P4$$w0rd (and if I don’t, I will gue...
PDF
I Know Your P4$$w0rd (And If I Don't, I Will Guess It...)
PDF
Perl5 hashes
PDF
Autentificacion sql antonio_hermoso
PPTX
Pen test: El arte de la guerra
PPT
MODELO PASO DE MENSAJES
PPTX
Presentacion password cracking_madrid_2019
PDF
Quasi - Practicas de Programacion en C
PDF
Encriptacion hash
ODP
Introducción a la Criptografia
PPT
Algoritmos de clave secreta, privada o simetrica.
ODP
Desarrollo de aplicaciones web usando Catalyst y jQuery
PDF
Alejandro Ramos - Know your ******: 4dv4nc3d P@55w0rd$ (r4c|&lt;1ng [RootedCO...
Criptografía en Webs 2.0
Introducción a PHP - Programador PHP - UGR
PHPVigo #19 - Lightning variables de entorno
Lima hack 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...
I Know Your P4$$w0rd (And If I Don't, I Will Guess It...)
Perl5 hashes
Autentificacion sql antonio_hermoso
Pen test: El arte de la guerra
MODELO PASO DE MENSAJES
Presentacion password cracking_madrid_2019
Quasi - Practicas de Programacion en C
Encriptacion hash
Introducción a la Criptografia
Algoritmos de clave secreta, privada o simetrica.
Desarrollo de aplicaciones web usando Catalyst y jQuery
Alejandro Ramos - Know your ******: 4dv4nc3d P@55w0rd$ (r4c|&lt;1ng [RootedCO...
Publicidad

Último (9)

PPTX
Control de seguridad en los sitios web.pptx
PPTX
ORIGEN DE LA IA - GRADO 1102 INTELIGENCIA
PPTX
Conceptos basicos de Base de Datos y sus propiedades
PDF
Presentacion de compiladores e interpretes
PPTX
Implementación equipo monitor12.08.25.pptx
PDF
Clase 3 - Presentación visual (Insertando objetos visuales) POWER POINT.pdf
PDF
AutoCAD Herramientas para el futuro, Juan Fandiño
PPTX
Tratará sobre Grafos_y_Arboles_Presentacion.pptx
PPTX
Fundamentos de Python - Curso de Python dia 1
Control de seguridad en los sitios web.pptx
ORIGEN DE LA IA - GRADO 1102 INTELIGENCIA
Conceptos basicos de Base de Datos y sus propiedades
Presentacion de compiladores e interpretes
Implementación equipo monitor12.08.25.pptx
Clase 3 - Presentación visual (Insertando objetos visuales) POWER POINT.pdf
AutoCAD Herramientas para el futuro, Juan Fandiño
Tratará sobre Grafos_y_Arboles_Presentacion.pptx
Fundamentos de Python - Curso de Python dia 1
Publicidad

PHPVigo #17 - lightning password hash

  • 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); } }