您将如何生成可重复的加密密钥?

Ant*_*y D 4 c# encryption passwords timezone rijndaelmanaged

我期待加密数据.我想基于密码生成加密密钥,以及一些移动值,如时间.目标是进行密钥更改,但让知道密码的任何人都能够解密.这发生在C#中.我使用以下代码来哈希密码.

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;
}
Run Code Online (Sandbox Code Playgroud)

然后我使用该哈希,加上盐来生成密钥.

        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);
Run Code Online (Sandbox Code Playgroud)

我这样做的方式似乎有问题.有些计算机位于不同的时区,或者当我发送数据时小时计时,或者机器时间稍微偏离.有更好的建议吗?

Bri*_*ian 8

标准策略是仅发送与加密密钥一起发送的值(时间等).由于您使用的价值是公共知识,如果首先创建密码的人公开提供"移动价值",则可以.见.你在做什么不是一种新技术.你似乎也在使用Key Enhance.