在C#中设置System.Security.Cryptography.AesManaged的键

问题描述 投票:1回答:1

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

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

我知道如果我希望我的用户提供密码,我需要所有这些。然后我需要从它们生成随机加密的强密钥。但是如果一切都是由计算机生成的,我是否需要以编程方式生成随机密码然后从中生成密钥,或者我可以使用AesManaged.Key包含的任何内容?

aes
1个回答
0
投票

是的,如果您愿意,可以使用默认的Key和IV值。您还可以使用以下方法显式重新生成新的随机:

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

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

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

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

我们使用PBKDF2(通过多次迭代推导)的原因是减慢攻击者的速度。我们为每位用户支付1次的罚款由攻击者多次支付。

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

© www.soinside.com 2019 - 2024. All rights reserved.