【问题标题】:Setting Key of System.Security.Cryptography.AesManaged in C#在 C# 中设置 System.Security.Cryptography.AesManaged 的​​密钥
【发布时间】:2018-03-06 04:44:09
【问题描述】:

当我在 C# 中实例化 AesManaged 时,它已经设置了 .Key 属性。使用它安全吗? IE。对于 AesManaged 的​​每个新实例(以及每次我在现有实例上调用 .GenerateKey() 时),它的加密强度和随机性是否足够?

我见过的所有示例,首先生成一个随机密码,然后使用 Rfc2898DeriveBytes 或 PasswordDeriveBytes 等密钥派生函数来生成密钥(例如How to use 'System.Security.Cryptography.AesManaged' to encrypt a byte[]?)。这需要额外的信息——比如盐值、密码迭代次数、使用什么哈希算法。

我知道如果我想让我的用户想出密码,我需要这一切。然后我需要从它们中生成随机的加密强密钥。但如果一切都是由计算机生成的,我是否需要以编程方式生成随机密码,然后从中生成密钥,还是只使用 AesManaged.Key 包含的任何内容?

【问题讨论】:

    标签: aes


    【解决方案1】:

    是的,您可以根据需要使用默认的 Key 和 IV 值。您还可以使用以下命令显式重新生成一个新的随机数:

    SymmetricAlgorithm.GenerateKey()SymmetricAlgorithm.CreateEncryptor(null, null)

    这取决于您要保护的内容以及您需要支持的信息所有者数量。如果速度/体积无关紧要,那么您最好采用 PBKDF2,通过使用 Rfc2898DeriveBytes 进行迭代。

    无论如何,您不希望在多个用户/租户/安全“领域”之间共享密钥,但是请确保您可以将默认密钥用于单个应用程序。如果这样做,请将盐与它混合。

    我们使用用户定义密码和盐的原因是为了避免利用通用/弱密码或用户之间共享密码的攻击,并确保应用程序所有者不知道他们的密钥。

    我们使用 PBKDF2(多次迭代的派生)的原因是为了减缓攻击者的速度。我们为每位用户支付 1 次的罚金被攻击者支付了多次。

    如果您的需要只是为单个应用程序或系统提供随机密钥,那么默认值是可用的,当然,假设它提供了您需要的强度。

    【讨论】:

    • CreateEncryptor()(无参数)使用 Key 属性中的密钥。您的意思是 GenerateKey() 制作一个新的吗?
    • @bartonjs - 是的,感谢您的更正。我更新了,也尝试更好地回答基本问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2013-08-07
    • 2021-10-01
    • 2019-09-04
    • 2020-03-01
    相关资源
    最近更新 更多