Contraseñas en bases de datos
Recientemente he estado revisando código de aplicaciones bastante críticas y me sorprendió ver cómo algunos códigos no cuidan en lo más mínimo ni la seguridad de sus usuarios, ni el riesgo reputacional/legal que pudiera afrontar la empresa por estas omisiones.
Considero urgente este pequeño artículo no para hablar de que tan sofisticado y seguro puede ser un esquema de autenticación, no para abrumarlos con pláticas de encripción y tecnología que honestamente ni alcanzo a entender o mucho menos obedecer, sino para decirles solamente lo mínimo que deben cuidar al construir un sistema de login, y esto por simple salud mental.
Desde los 80's y antes de que el UI "ayudará" un poco, ya los ingenieros de software buscaban como hacer passwords seguros. Ya saben, que el caractér, que la mayúscula, que el número de letras, que cada semana, que no se repita, que no haya secuencia... ¡Nada de eso es importante!, es más, mata la experiencia de usuario y es horrible, levante la mano quien haya abandonado un proceso de onboarding por una contraseña imposible. ¡Todos!.
Triste, porque el deber ser es que esa definición o grado de complejidad en las contraseñas le toca mandarlo al usuario y no a la aplicación. No es nuestro trabajo exigirle al usuario cumplir con políticas para creación de contraseñas (salvo que trabajemos en banco regulado por órganos de gobierno con estándares diseñados para enloquecer a cualquier cuenta-habiente y hasta al mismo banco).
Nuestro trabajo solamente es almacenar las contraseñas de forma tal que no se sea "fácil" robarlas de una base de datos. Recordemos que las grandes fugas típicamente vienen de adentro, alguien con acceso a la base de datos que la vende, o facilita el acceso. En comparación considero que son menos los robos atribuidos por la ingeniería social, phishing o fuerza bruta para "adivinarlas".
Habiendo dicho lo anterior, que es muy debatible por supuesto, el fin de este artículo es ser práctico y orientarlo a Coldfusion para que la comunidad de CFDev's tenga por lo menos buenas prácticas y luego las endurezca conforme dicte su necesidad o apetito.
Lo más importante considero yo es que NUNCA SE ALMACENE EN "CLARO" una contraseña en una base de datos. Es importante encriptar y almacenar de forma encriptada. Para hacer el login se debe comparar contra el dato encriptado y no contra el dato crudo.
Y que significa esto?