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);

我这样做的方式似乎存在问题。一些计算机位于不同的时区,或者如果我发送数据时时间滴答作响,或者机器时间略有偏差。有更好的建议吗?

4

5 回答 5

8

标准策略是只发送刚刚发送的值(时间等)和加密密钥。由于您使用的值是公共知识,因此如果首先创建密码的人公开提供“移动值”就可以了。见。你所做的并不是一项新技术。您似乎也在使用Key强化

于 2009-08-12T13:26:22.860 回答
2

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

于 2009-08-12T13:25:44.717 回答
1

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

于 2009-08-12T13:24:50.740 回答
0

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

于 2009-08-12T13:45:31.013 回答
0

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

rfc2898derivebytes

密码导出字节

于 2009-08-13T15:48:09.463 回答