¿Son 2 rondas de hashing SHA256 una forma segura de almacenar contraseñas y otros datos confidenciales?

No, 2 rondas de SHA256 (o cualquier otra función hash simple) no es una forma segura de almacenar contraseñas. Menciona los ataques de diccionario, pero hay muchas otras cosas a tener en cuenta que quizás no haya pensado. La respuesta estándar, entonces, es usar una función de hash de contraseña que fue específicamente diseñada y probada por criptógrafos profesionales para ese propósito: bcrypt , PBKDF2 y scrypt son los más recomendados, pero Argon2 también fue revisado y recomendado recientemente por un consorcio. de expertos

Una función de hash de contraseña debe tener ciertas propiedades para proteger contra ataques, y las funciones simples de hash de bloques de construcción (como las familias de hashes MD y SHA) no tienen estas propiedades:

  1. Debe ser no reversible. Esperemos que la razón sea obvia, pero considere cómo un atacante podría recuperar los hash en primer lugar: al ejecutar cierto nivel de control sobre su aplicación (a través de la inyección SQL, tal vez), podría recuperar no solo los hash sino también cualquier rutina de descifrado que haya usado.
  2. Debe ser costoso para el atacante probar la validez de una contraseña. Probar repetidamente las contraseñas candidatas es la actividad principal del descifrado de contraseñas; Los ataques de diccionario son solo una forma de elegir contraseñas candidatas. Si un atacante puede probar 4 millones de contraseñas en un segundo, entonces probablemente podrá adivinar con éxito muchas contraseñas. Al acoplar rondas de una función hash más simple y usar algoritmos no paralelizables que requieren mucha memoria, las funciones hash de contraseña limitan al atacante a solo cientos de conjeturas por segundo en el mismo hardware.
  3. La misma contraseña no debe producir el mismo hash en todos los casos. De lo contrario, la reutilización de contraseñas (que ocurre más de lo que a la mayoría de las personas les gusta admitir) reduce el trabajo que un atacante debe realizar en el craqueo. Además, esto evita los ataques de precomputación, donde las tablas de búsqueda de todas las contraseñas posibles (“tablas de arco iris”) se comparten entre los atacantes para que puedan revertir rápidamente los hashes en un volcado. Las tablas de arcoíris para los hash MD5, SHA1, LM y NTLM están fácilmente disponibles porque esos hashes no están “salados” con un valor aleatorio para evitar esto.

Hay otros requisitos, pero estos son el núcleo. Además, muchas funciones de hashing de contraseñas ofrecen una configuración de “factor de trabajo”, que puede usarse para dificultar el descifrado, a expensas de hacer que las verificaciones (intentos de inicio de sesión reales) consuman más recursos. Además, estas funciones son portátiles: si decide cambiar los marcos, está casi garantizado que habrá una implementación de bcrypt en el nuevo marco. Los esquemas de hash personalizados no solo están cargados de peligros, sino también frágiles: es probable que la reimplementación en otro idioma se rompa de formas extrañas e improbables.

No, ya que solo tengo que hacer una segunda ronda en mi diccionario, también quieres hacer sal … problema resuelto.

Piense en cualquier permutación fija y conocida de esta manera: solo tengo que permutar mi diccionario de la misma manera, entonces es como si no se hiciera permutación.