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

时间:2009-08-12 13:20:04

标签: c# encryption timezone passwords 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;
}

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

        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 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:2)

您可能只是将更改部分(未加密)与加密数据一起发送,以便知道密码的任何人都可以轻松地重建用于加密的密码。由于变化部分相对容易猜测,因此不会降低安全性。

答案 2 :(得分:1)

您可以找到一个方案,该方案在一个时间窗口内生成相同的移动值,以当前时间为中心。因此,如果您选择一个12小时的窗口,所有计算机落后6小时,比您提前6小时生成相同的加密密钥。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

rfc2898derivebytes

passwordderivebytes