Almacenamento seguro de contrasinais en base de datos
Ir a la navegación
Ir a la búsqueda
Sumario
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.
- Información sobre a seguridade das passwords.
- 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
- A cadea SALT a podemos proporcionar nos ou podemos xerar unha por medio da función password_hash.
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 }