当我在C#中实例化AesManaged时,它已经设置了.Key属性。使用它安全吗?即对于每个AesManaged的新实例化(以及每次在现有实例上调用.GenerateKey()),它是否具有加密强度和随机性?
我见过的所有例子,首先生成一个随机密码然后使用密钥派生函数,如Rfc2898DeriveBytes或PasswordDeriveBytes来生成密钥(例如How to use 'System.Security.Cryptography.AesManaged' to encrypt a byte[]?)。这需要额外的信息 - 例如盐值,密码迭代次数,要使用的哈希算法。
我知道如果我希望我的用户提供密码,我需要所有这些。然后我需要从它们生成随机加密的强密钥。但是如果一切都是由计算机生成的,我是否需要以编程方式生成随机密码然后从中生成密钥,或者我可以使用AesManaged.Key包含的任何内容?
是的,如果您愿意,可以使用默认的Key和IV值。您还可以使用以下方法显式重新生成新的随机:
SymmetricAlgorithm.GenerateKey()或SymmetricAlgorithm.CreateEncryptor(null, null)
这取决于您所保护的内容以及您需要支持的信息所有者数量。如果速度/体积无关紧要,那么通过使用Rfc2898DeriveBytes进行迭代,您仍然可以更好地采用PBKDF2。
无论如何,您不希望在多个用户/租户/安全“领域”之间共享密钥,但是,确保您可以使用单个应用程序的默认密钥。如果你这样做,将盐与它结合起来。
我们使用用户定义的密码和盐的原因是为了避免利用公共/弱密码或用户之间共享密码的攻击,并确保应用程序所有者不知道他们的密钥。
我们使用PBKDF2(通过多次迭代推导)的原因是减慢攻击者的速度。我们为每位用户支付1次的罚款由攻击者多次支付。
如果您的需求只是为单个应用程序或系统提供随机密钥,则默认值是可用的,当然,假设它提供了您需要的强度。