c# encryption timezone passwords rijndaelmanaged

c# - ¿Cómo generaría la clave de cifrado repetible?



encryption timezone (5)

Estoy buscando encriptar datos. Quiero generar claves de cifrado basadas en una contraseña y algún valor en movimiento, como el tiempo. El objetivo es cambiar la clave, pero que cualquiera que sepa la contraseña podrá descifrarla. Esto está sucediendo en C #. Estoy usando el siguiente código para hash la contraseña.

private static string GetPasswordHash(string password) { TimeSpan span = (DateTime.UtcNow - new DateTime(1900, 1, 1)); string result = Convert.ToInt32(span.TotalHours).ToString(); result += password; result += Convert.ToInt32(span.TotalDays).ToString(); result = Convert.ToBase64String(SHA256.Create().ComputeHash(Encoding.ASCII.GetBytes(result))); return result; }

Luego uso ese hash, más una sal para generar una clave.

Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes(GetPasswordHash(password), salt); rdb.IterationCount = 1000; RijndaelManaged rm = new RijndaelManaged(); rm.KeySize = 256; rm.Key = rdb.GetBytes(32); rm.IV = rdb.GetBytes(16);

Parece que hay problemas con la forma en que estoy haciendo esto. Algunas de las computadoras se encuentran en diferentes zonas horarias, o si la hora marca al enviar los datos, o si los tiempos de las máquinas están un poco apagados. ¿Hay mejores sugerencias?


¿Le preocupa que un archivo con la misma información cifrada con la misma contraseña tenga el mismo aspecto? Podría usar establecer el vector de inicialización con la hora actual y encriptar usando su contraseña. Para descifrar, utiliza el mismo valor IV (por lo que debe almacenarse sin cifrar con su archivo en algún lugar).


La estrategia estándar es simplemente enviar el valor (tiempo, etc.) que acaba de enviarse con la clave de cifrado. Dado que el valor que está utilizando es de conocimiento público, está bien si quien primero crea la contraseña proporciona el "valor móvil" públicamente. Ver sal . Lo que estás haciendo no es una técnica nueva. También parece que está utilizando el Fortalecimiento clave .


Puede encontrar un esquema que genere el mismo valor móvil en un intervalo de tiempo, centrado en la hora actual. Por lo tanto, si elige una ventana de 12 horas, todas las computadoras con 6 horas de retraso y 6 horas antes que la suya generarán la misma clave de cifrado.


Puede enviar la parte cambiante (sin cifrar) junto con los datos cifrados, para que cualquiera que conozca la contraseña secreta pueda reconstruir fácilmente la contraseña utilizada para el cifrado. Como la parte cambiante es relativamente fácil de adivinar, no lo haría mucho menos seguro.


La derivación de clave basada en contraseña ya está implementada en .net. Si bien no puedo ver nada malo con su función GetPasswordHash (), siempre vale la pena usar las funciones de la biblioteca en crypto, ya que es probable que se prueben mejor y los pequeños errores pueden destruir por completo la seguridad de un sistema. Aquí hay dos enlaces, probablemente también haya otros:

rfc2898derivebytes

passwordderivebytes