我想对数据进行加密。我希望根据密码和一些移动值(例如时间)生成加密密钥。目标是让密钥发生变化,但任何知道密码的人都能解密。这是在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);
看起来我这样做存在问题。一些计算机处于不同的时区,或者当我发送数据时小时数变化了,或者机器时间略有偏差。有更好的建议吗?