Almacenamento seguro de contrasinais en base de datos

De MediaWiki
Ir a la navegación Ir a la búsqueda

Gardando campos a protexer na base de datos

  • En moitas ocasións imos necesitar gardar nunha base de datos información que non queremos que sexa 'visible' en caso de que alguén poida acceder a nosa base de datos.
  • Un exemplo típico é o das contrasinais dos usuarios do noso sitio web, no caso de implantar un sitio web cunha validación de usuarios.
Nunca debe estar baseada nun dicionario.
Debe levar caracteres alfanuméricos, maiúsculas e minúsculas e algún carácter non alfanumérico.
Debe ser polo menos 10 ou máis caracteres
  • Para gardar a información dunha forma segura temos que aplicar un algoritmo de hash.
En PHP temos dispoñible a función de hash.
1 <?php
2 echo hash('ripemd160', 'The quick brown fox jumped over the lazy dog.');
3 ?>
Dará como resultado:
1 ec457d0a974c48d5685a7efa03d137dc8bbde7e3


  • En PHP temos funcións de hash específicas dun tipo de algoritmo. Por exemplo a función md5.
1 <?php
2 echo md5('The quick brown fox jumped over the lazy dog.')           // As dúas funcións devolven o mesmo
3 echo hash('md5', 'The quick brown fox jumped over the lazy dog.');  // As dúas funcións devolven o mesmo
4 ?>


  • Pero esta forma de 'tratar' a información non chega, xa que se podería descubrir o valor orixinal pola forza bruta.
Para complicalo un pouco máis debemos facer uso de SALT'.
  • Salt é unha cadea que se aplica no proceso de hash e fai que sexa practicamente imposible utilizar mecanismos de forza bruta ou Táboas Rainbow para obter a cadea orixinal.


Exemplo de como utilizar salt na función md5

Almacenamento

1 <?php
2 $password='q121ahgsha..'; // Password introducida polo usuario. Viría dun formulario con $_POST['txtPassword'].
3 $cadeaSalt='unha cadea ao chou';
4 
5 echo md5($cadeaSalt,$password)
6 ?>
Cabe sinalar que se a contrasinal é débil, é posible chegar a rompela, polo que é moi importante que a contrasinal sexa 'forte'.
A cadea SALT pode ser calquera cadea e mellor que non estea baseada en ningún dicionario.


Opción recomendada

1 $password = password_hash('contrasinal_a_codificar', PASSWORD_DEFAULT);
Codifica a contrasinal utilizando o algoritmo bcrypt e o resultado é unha cadea de 60 caracteres de lonxitude. Seguramente en versións posteriores, o algoritmo vai devolve lonxitudes máis grandes, polo que é recomendable gardar a contrasinal nun campo de 256 caracteres de lonxitede.
Esta forma de codificar fai que o valor SALT cambie de cada vez.
O resultado será o valor que teremos que gardar na base de datos.

Comprobación

Para realizar o proceso contrario, e comprobar se o password introducido por un usuario se corresponde con o gardado na base de datos, teremos que facer uso da función password_verify().

 1 $orixinal = 'password_introdicada_polo_usuario';
 2 $codificado = '2y$10$ETpCoo11Gd3w2kx4x1me1OQtx.p67c6eRzg6OSRgPxUsBGaQnff4W';
 3  
 4 $iguais = password_verify($orixinal, $codificado);
 5  
 6 if ($iguais) {
 7     echo 'Password correcto';
 8 } else {
 9     echo 'Password incorrecto';
10 }

Referencias