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