dale al atacante una ventaja
Depende. ¿Qué intenta hacer el atacante?
Dado que usted llama a una de las piezas de datos involucradas "contraseña", asumo que el objetivo del atacante es encontrar esta contraseña, y su objetivo es mantenerla en secreto.
No está claro a qué te refieres con AES.Encrypt(bytesToEncrypt, password)
. Supongo que quiere decir que está utilizando uno de los modos de operación de cifrado de bloque usando AES como el cifrado de bloque, siendo bytesToEncrypt
la clave y password
el mensaje a cifrar, o quizás al revés. A continuación, escribiré AES.Encrypt(key, message)
, donde key
es la clave de cifrado y message
es la cadena para cifrar, ya que ese es el orden de los argumentos utilizados en prácticamente todas las API.
Si revela SHA256.Hash(password)
, entonces el atacante puede encontrar la contraseña calculando SHA256.Hash(p)
para muchos valores de p
hasta que encuentren una con un hash matching coincidente. Pueden hacer los cálculos ellos mismos o aprovechar los cálculos realizados por otros. Esto podría ser devastador si el hash es algo así como b9f195c5cc7ef6afadbfbc42892ad47d3b24c6bc94bb510c4564a90a14e8b799 , a menos si se trata de algo así como Si revela AES.Encrypt(key, password)
al atacante, entonces el atacante puede saber dos cosas:
- Sabrán la longitud exacta o aproximada de la contraseña, según el modo de cifrado que usaste.
- Si el atacante también logra obtener
bytesToEncrypt
, entonces sabrán la contraseña.
Si quisiera calcular AES.Encrypt(password, message)
, entonces se encontraría con el problema de que esto realmente no tiene sentido. Una clave AES debe ser una cadena de 16 bytes, 24 bytes o 32 bytes. Ninguna otra longitud de cadena es posible: el algoritmo simplemente no está definido para otras longitudes de cadena. Si usa una contraseña que tiene la longitud de byte requerida, es una muy mala idea porque se supone que las claves se generan aleatoriamente. Si usa una contraseña que consta de caracteres imprimibles y tiene patrones que la hacen memorable, no está usando AES de la forma en que fue diseñada. Abre el camino a ataques de claves relacionadas : es posible aprender cosas de las relaciones entre claves, como "esto la clave consiste solo en caracteres ASCII "(es decir, el bit más significativo de cada byte es 0). AES tiene debilidades conocidas contra ataques de claves relacionadas, lo cual no es un problema en la práctica porque ningún protocolo sano involucra claves relacionadas. Sin embargo, usar una contraseña como clave no es un protocolo sano. Además, obviamente estás revelando algo acerca de la longitud de la contraseña y lo estás exponiendo al mismo tipo de ataque de fuerza bruta que el caso SHA-256 si se conoce message
.
Encontrar la contraseña a través de su hash y encontrar la contraseña a través de su cifrado son bastante independientes. AES y SHA-256 son diseños no relacionados. Saber el cifrado revela el tamaño y, por lo tanto, facilita la búsqueda de una contraseña con un hash coincidente, pero solo de forma marginal. Saber que el hash no ayuda a romper el cifrado, a menos que encuentre la contraseña.
Revelar o bien el cifrado o el hash SHA-256 de una contraseña es una idea terrible, ya que cada una de ellas tiene debilidades evidentes (una se descompone si la clave se filtra, la otra es vulnerable a la bruta). ataques de fuerza). Las contraseñas solo deben almacenarse en forma de un hash lento y salado , y el hash debe mantenerse en secreto para una buena medida.
¹ En teoría, no sabrían si lo que encontraron es la contraseña real o alguna cadena diferente con el mismo hash. Sin embargo, no se conoce una forma de encontrar dos cadenas con el mismo hash SHA-256, y se necesitaría una búsqueda de fuerza bruta en todas las computadoras existentes en la actualidad aproximadamente la vida útil del universo para tener una posibilidad no despreciable de encontrar una. .