Seguridad de Passwords: Salado(salting), #1 – Almacenamiento de Passwors
Seguridad
Prácticamente en todas las aplicaciones actuales se manejan usuarios y passwords para permitir el acceso a sistemas.
También es muy conocido que es esa información de las más codiciadas por los “asaltantes” informáticos.
Como desarrolladores de sistemas, tenemos la obligación moral (y a veces legal) de proteger dicha informacién de nuestros usuarios. Anteriormente era común encontrar los datos almacenados en campos de texto plano “Usuario” y “Password” – de más esta decir que es el peor diseño en seguridad de información:
| ID_Usuario | Usuario | Password |
| 1 | fulanito | entradasistema |
| 2 | manganito | manganito |
| 3 | juanperez | password |
| 4 | josesanchez | password |
Un atacante que lograra obtener acceso a los datos, fácilmente podría entrar al sistema usando la identidad de otro usuario.
Ahora, con las mejoras tanto en legislación como en diseño de seguridad en sistemas, es común encriptar el password para que, si un atacante lograra entrar al sistema, no pudiera descifrar la información obtenida. Usando MD5 para encriptar los datos de ejemplo, tendríamos Password=MD5(password):
| ID_Usuario | Usuario | Password |
| 1 | fulanito | c09e9b31561eecdbb4f66e978ddba2ac |
| 2 | manganito | be36b8eb2fabe4e58e2f6c0f8089fe20 |
| 3 | juanperez | 5f4dcc3b5aa765d61d8327deb882cf99 |
| 4 | josesanchez | 5f4dcc3b5aa765d61d8327deb882cf99 |
Prácticamente imposible de descifrar, no? Totalmente falso… Con la sofisticación de los ataques informáticos, hoy en dia una simple función de hash para encriptar información tan delicada como passwords es insuficiente. Porque? La mayoria de los usuarios elige passwords poco seguros (nombres, direcciones, fechas, palabras conocidas, hasta el mismo username), por lo que un atacante con acceso a la BD de usuarios sólo tendría que hacer un ataque de palabra conocida encriptada para obtener algunos passwords. Para facilitarse el trabajo, el atacante podria realizar un escaneo del hash de los passwords y detectar información repetida para centrarse en esos datos en el ataque de palabra conocida. Es decir, si hay 10 usuarios que utilizan la palabra “password” como password, habra 10 registros en la BD con el valor de “5f4dcc3b5aa765d61d8327deb882cf99″ (al igual que juanperez y josesanchez de nuestro ejemplo). Y, de otro modo, si se encuentran varios registros con el mismo valor, lo mas seguro es que sea una palabra conocida (cuantos utilizan el nombre de la empresa en que laboran como password para la intranet?)
Salado(Salting)
Para mitigar este peligro, existe una técnica que se llama “Salado” de password (de Salting en inglés). Esta técnica consiste en agregar información extra específica a cada usuario antes de realizar el cifrado del password. Entonces, al aplicar la función de hash, el resultado es unico(*) para cada usuario. En nuestro ejemplo usaremos la informacion extra ID_Usuario, por lo que obtendriamos Password=MD5(password + ID_Usuario):
| ID_Usuario | Usuario | Password |
| 1 | fulanito | 8b206463571df9f233165f1e3e0b3732 |
| 2 | manganito | 99259365af4debf221517baf4fed5bb2 |
| 3 | juanperez | 819b0643d6b89dc9b579fdfc9094f28e |
| 4 | josesanchez | 34cc93ece0ba9e3f6f235d4af979b16c |
* único en el termino relativo a la BD. Es conocido que la función MD5, al tener un número finito de resultados y un número infinito de datos de entrada, tiene muchas colisiones de hash strings. Sin embargo para nuestro ejemplo práctico de usuario/password, siempre obtendremos resultados únicos.
Con este método vemos que ya no encontraremos datos idénticos almacenados, haciendo mas difícil el ataque.
Recordemos que ningún método es infalible y ningún sistema es inviolable, pero el tomar acciones como la aquí sugerida aminora los riesgos que tenemos del lado del almacenamiento de datos.
En el siguiente artículo se tratará el tema de salting del lado de usuario. Como sabemos, es el usuario el eslabóm más débil en seguridad de sistemas, pero con un poco de educación por parte de la administración de sisteas y de responsabilidad por parte del usuario, podemos obtener un nivel de seguridad aceptable. Para los usuarios, el artículo ira encaminado a mejorar los passwords que usan para accesar a los sistemas y evitar que su información sea accesada por personas no autorizadas para ello.
Salud!



