我正在寻找加密数据。我想根据密码和一些移动值(例如时间)生成加密密钥。目标是更改密钥,但让任何知道密码的人都能够解密。这发生在 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;
}
然后我使用该散列和盐来生成密钥。
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);
我这样做的方式似乎存在问题。一些计算机位于不同的时区,或者如果我发送数据时时间滴答作响,或者机器时间略有偏差。有更好的建议吗?