Entonces, cuando se trata de seguridad, cuando tengo una idea que parece buena, pero parece que nadie más lo está haciendo, trato de asumir que estoy pasando por alto algo obvio o significativo. Este es uno de esos casos ...
El contexto de esta pregunta es un sistema de autenticación en el que estoy empezando a trabajar. He implementado sistemas similares en el pasado, y generalmente tengo mi cabeza en torno a la cuestión de "sal y hash", pero de ninguna manera soy un experto en seguridad criptográfica.
Cuando estaba en el proceso de definir el almacenamiento para 16 bytes aleatorios de sal en mis registros de usuario, se me ocurrió que podría haber una manera de reducir la superficie de ataque en caso de que alguien haya robado o haya accedido a mi datos del usuario. Estoy operando a partir de los siguientes supuestos:
- Si un pirata informático roba los datos de mi usuario, tendrá acceso a una representación hash + (repetida) con sal de la contraseña del usuario, y el valor de sal en sí.
- Si el pirata informático quiere determinar el valor de texto sin formato de esa contraseña, tiene un poco de trabajo de fuerza bruta frente a ellos.
- Sin embargo, dada la sal, el espacio de búsqueda de ese ataque de fuerza bruta se reduce considerablemente. *
* No estoy 100% seguro de que el punto tres sea correcto, pero tiene sentido para mí si un algoritmo de fuerza bruta puede suponer que el valor de hash previo consiste en <8-or-so-bytes-of-password> + <16-bytes-from-stolen-salt>
(o una combinación similar de la contraseña y valores de sal), entonces hemos reducido el espacio de búsqueda por cantidades algorítmicamente significativas.
< obligatorio a mitad de la pregunta disculpa por la longitud de esta pregunta aquí >
Entonces, dado que mi línea de pensamiento actual es la anterior, la solución que considero esencialmente se reduce a usar valores constantes y conocidos sobre un usuario para generar dinámicamente una sal para usar durante el paso de hashing.
Dado que los valores de sal realmente no tienen que ser criptográficamente "nada", siempre y cuando no se puedan adivinar hasta el punto de requerir el descubrimiento de fuerza bruta, ¿es suficiente para tomar una transformación de, digamos, el nombre de usuario y la contraseña proporcionados? (por ejemplo, aplique algo de SHA-2 y sistemas de cifrado de propiedad), y úselo en el paso de hash.
Por supuesto, si alguien también robara el código, la generación de sal "secreta" no tiene sentido. La única seguridad adicional que estoy tratando de lograr es forzar al pirata informático a robar mis datos y mi código si quieren la comodidad del espacio de búsqueda reducido descrito anteriormente en el punto 3.
Espero haber descrito adecuadamente (y no demasiado verbalmente) mi pregunta y mi razonamiento. La pregunta específica que espero haber respondido es si se trata o no de un medio criptográfico (o no) seguro para almacenar y comparar las contraseñas de los usuarios.
Editar: Parece que los puntos clave de mi pregunta pueden haberse perdido en el ruido de arriba. Déjame intentar ser más explícito:- ¿Tener acceso a la sal utilizada para generar un valor de hash ayuda sustancialmente a un ataque de fuerza bruta en el descubrimiento de la contraseña real?
- Si es así, ¿por lo tanto tiene sentido que los hackers tengan que robar mi código además de los datos en sí?
- ¿Es el enfoque general de generar dinámicamente la sal (utilizando medios reproducibles, no aleatorios, pero no presumibles) desaconsejable?