Me gustaría buscar otra forma de guardar las credenciales, que se utiliza para verificar el usuario que intenta iniciar sesión, en mi base de datos.
Se me ocurrió esta idea. Ya que creo que incluso conocer un texto sin formato y un texto cifrado correspondiente derivado con el cifrado AES-256 no debería llevar a la revelación de la clave, cuando la clave es lo suficientemente larga y lo suficientemente aleatoria, puedo tomar la contraseña como la clave de cifrado aquí. ?
Considere un ejemplo, suponga que el usuario 'prueba' debería usar 'apple' como su contraseña. En el registro, el programa funciona así:
- Elija una cadena aleatoria de 32 bytes. Denotado por
R
; - Construya el texto simple
P
, porP = Whirlpool(R:'test':'apple')
; AquíWhirlpool
es el algoritmo hash con el mismo nombre. - Me gustaría hacer que la clave sea más larga, así que derive
K
como la clave utilizada para AES-256:K=Whirlpool('apple')
; - Encripte
P
por AES-256, por lo tanto, obtenga el texto cifradoE=AES256Encrypt(K, P)
; - Entonces, unamos
R
yE
juntos, obtenemos la credencialAUTH
que se debe guardar en la base de datos:AUTH=R:E
.
Y cuando más tarde obtengamos uno que ingrese el nombre de usuario y la contraseña, podemos verificarlo haciendo:
- Busque el nombre de usuario y obtenga
AUTH
; - Separe este
AUTH
y obtendremosR
yE
; - Utilice el nombre de usuario y la contraseña dados, podríamos calcular
P'
, que se basa enR
de la base de datos, el nombre de usuario y la contraseña de entrada. - Y podremos derivar
K'
, un hash en el algoritmo de Whirlpool con esta contraseña como entrada. - Así que usamos
K'
para intentar descifrarE
, y cuando se descifra con éxito, compare el descifrado conP'
.
En resumen: ¿puedo usar mi contraseña como la clave en AES-256, y al comparar un texto sin formato conocido y el resultado de descifrado del texto cifrado almacenado, para verificar a los usuarios, y para evitar la filtración de las contraseñas de los usuarios después de la filtración de la base de datos? ?
En mi opinión, solo saber el nombre de usuario (con hace poco aquí) y el AUTH
solo debería filtrar las sugerencias sobre cómo construir una posible clave de descifrado. El atacante puede conocer tanto un texto plano bastante aleatorizado (y no tiene opción de personalizarlo) como un texto cifrado fijo. Y si aquí está AES-256, no debería haber ninguna posibilidad de revelar la clave (que no es la contraseña real) basándose solo en estos dos factores.
Y la aleatoriedad de este texto simple (derivado de una conjunción de R
, nombre de usuario, contraseña) tampoco es importante aquí. Pero parece que la aleatoriedad de la clave puede indicar.
El último aspecto a considerar puede ser la velocidad. Para mí, la velocidad no es realmente un problema, al menos ahora. Y aunque el proceso anterior ha utilizado (ya sea en el registro o en la verificación) 2 veces de hash y una vez de AES, podemos reducir el Whirlpool a una sola vez. Cuando comparo esto con HMAC con Whirlpool (aquí se usan dos veces de Whirlpool), veo que aquí solo hay una vez de Whirlpool y una vez de AES. Si AES es más rápido que un algoritmo hash como Whirlpool, creo que puede haber una ventaja. Pero agradecería a cualquiera que se refiera a este aspecto.