如何生成可重复使用的加密密钥?

4

我想对数据进行加密。我希望根据密码和一些移动值(例如时间)生成加密密钥。目标是让密钥发生变化,但任何知道密码的人都能解密。这是在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);

看起来我这样做存在问题。一些计算机处于不同的时区,或者当我发送数据时小时数变化了,或者机器时间略有偏差。有更好的建议吗?

5个回答

8
标准策略是将值(时间等)与加密密钥一起发送。由于您使用的值是公开知识,因此如果首次创建密码的人公开提供“移动值”,那么这是可以接受的。请参见Salt。您正在做的不是新技术。您似乎还在使用Key Strengthening

2
你可以将更改部分(未加密)与加密数据一起发送,这样任何知道秘密密码的人都可以轻松重构用于加密的密码。由于更改部分相对容易猜测,因此它不会使其安全性降低太多。

1
你可以找到一个方案,它会在以当前时间为中心的一段时间窗口内生成相同的移动值。因此,如果你选择了一个12小时的时间窗口,所有比你落后6个小时和领先6个小时的计算机都会生成相同的加密密钥。

0
你是否担心使用相同密码加密的相同数据文件看起来都一样? 你可以使用当前时间设置初始化向量,并使用密码进行加密。 要解密,您需要使用相同的IV值(因此必须在某个地方未加密地存储它与您的文件一起)。

0

基于密码的密钥派生已经在 .net 中实现。虽然我看不出你的 GetPasswordHash() 函数有什么问题,但在加密方面使用库函数总是值得的,因为它们很可能经过更好的测试,而小错误可能会完全破坏系统的安全性。这里有两个链接,可能还有其他链接:

rfc2898derivebytes

passwordderivebytes


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接