Hoy tengo una pregunta totalmente teórica: ¿cuál es la "mejor" práctica para almacenar contraseñas? [Lo mejor en términos de seguridad y rendimiento]
Por lo general, especialmente los desarrolladores de PHP tienden a almacenar las credenciales de los usuarios en texto sin formato o como hash, utilizando MD5 o SHA1 y sus sucesores. Los desarrolladores web y cocineros de software más inteligentes incluso agregan un poco de sal a la contraseña antes de hacer hash.
Los desarrolladores de Android por lo general parecen almacenar en texto sin formato, por lo que he visto hasta ahora, confiando ingenuamente en el concepto de derechos de usuario de Android, incluso argumentando que enraizar los dispositivos es culpa del usuario.
Hay muchas prácticas diferentes por ahí. Texto sin formato para esas aplicaciones, donde los desarrolladores dependen de la seguridad de la plataforma o quieren que el usuario recupere su propia contraseña. Hashing donde los desarrolladores confían en la integridad de su algoritmo de hash, ignorando los ataques de colisión, etc. Hashings salados donde los desarrolladores leen que el hashing simple es algo malo debido a las tablas de arco iris. Incluso hay algunos desarrolladores que utilizan la criptografía real, pero generalmente la clave se puede recuperar en algún lugar.
Mi idea fue utilizar AES (o [aún no está rota] la criptografía simétrica en general, como el pez globo y así sucesivamente), que encripta la contraseña rellenada (para ocultar la longitud de la contraseña) con un prefijo de sal. La Clave sería la contraseña del usuario, lo que debería hacer imposible recuperar y verificar la contraseña sin la contraseña.
Me pregunto por qué la práctica habitual difiere de esa idea, entonces, ¿dónde está la culpa? La complejidad no debería ser tan alta, porque existen buenas implementaciones de AES, incluso implementaciones de hardware. No hay colisiones hash posibles en esto.
Entonces, ¿tengo razón en que nadie podría usar un volcado de datos con esas contraseñas para otra cosa que no sea la fuerza bruta? [Por supuesto, hay otros ataques, que son independientes del almacenamiento de contraseñas de back-end, no son el tema de esta pregunta]
¿Puede ser que esta idea sea bastante similar y esté relacionada con bcrypt, pero sin múltiples iteraciones?