首页 文章

AesManaged的密码设置和秘密管理

提问于
浏览
2

我正在实施一种用于中等安全数据传输的共享秘密加密方案 . 当服务器配置客户端时,我可以生成一个或多个代表该秘密的字符串 . 然后,客户端将使用此秘密信息在将数据发送到服务器之前对其进行加密 . 我希望确保共享密钥尽可能强大并足以保证互操作性 .

Algorithm/class selection :似乎应该"stick to AES unless you have a good reason not to." AesManaged是一个不错的选择吗? Difference between symmetric crypto algorithms

Settings and default object :我在系统的不同部分使用.NET 4.0和.NET 4.5,并且可能会随着时间的推移而升级 . 我找不到KeySize和BlockSize的默认属性的文档,也没有IV的默认长度 . 在.NET 4.0中,默认密钥大小为32(字节,256位),默认IV大小为16(字节) . BlockSize和FeedbackSize是128(位) . 模式是CBC,Padding是PKCS7 . 我应该明确设置哪些属性,之后是否应该重新生成密钥和IV?

[ Edits :修正了256位以上和以下 . 添加了问题 . ]

256位密钥和16字节IV是否足以支持“非政府工作”?

我已经读过256位密钥容易受到某种攻击(我不认为这种情况适用于我的情况) . 有没有理由使用128位密钥?什么是性能差异?

默认密钥大小是否大于块大小是正常的吗?

[ Edits :完成 . ]

Strength of default key and IV :有没有理由使用RNGCryptoServiceProvider.GetBytes()或者AesManaged正在做什么?

Interoperability :我假设共享密钥由密钥和IV(编码为Base64字符串)组成 . 从恢复的字节数组中设置Key和IV属性是否足以设置相关属性(例如KeySize)?

是否可以推断并保证同意任何其他属性,或者我应该明确地设置它们用于密钥生成,加密和解密?

Key generation code

AesManaged myAes = new AesManaged(); // use defaults
string keyString = Convert.ToBase64String(myAes.Key);
string ivString = Convert.ToBase64String(myAes.IV);

代码和背景:我从这里大量借用:http://msdn.microsoft.com/en-us/library/vstudio/system.security.cryptography.aesmanaged%28v=vs.100%29

1 回答

  • 2

    AES(或Rijndael)几乎是标准,Linux风暴鱼出现在我的脑海中,但在C#中你想要坚持你拥有的免费产品 .

    我必须确切地知道你在做什么 . 但安全就是知道你做了什么 .

    其余的我只能说这个 . 将密钥大小从128增加到192或256位(或其他设置而不实际更改算法)相对容易,因此从常用值开始并使其工作 . 但是,如果您可以使用相同的代码库进行更好的加密,那么为什么要少花钱?另一方面,安全是妥协 . 没有什么是完全安全的,这完全取决于你愿意花多少钱 .

    我现在说的不会取悦你 . 共享秘密会使你的所有努力变得毫无用处 . 如果窃听者可以 grab 秘密,加密就完全没用了 .

    对于存储的数据,选择可能没问题,只要您每次要解密该块时都要求密钥,并且永远不会将密钥存储在磁盘上(就像KeePassX要求输入密码来打开密钥文件一样) .

    对于移动中的数据(通过网络发送),非对称加密是必不可少的,除非您有其他方式来传达秘密 . 也就是说,永远不要通过互联网发送秘密,而是使用互联网方式(普通旧邮件,可能是电话或面对面) .

    如您所见,分享秘密是真正的问题 . 显而易见的解决方案是SSL,但它是非对称的,C#实现非常不稳定,特别是对于可能在mono / Linux / OpenSSL上运行的多平台应用程序 . 如果你走那条路,那就准备好做一场噩梦吧 .

    没有SSL或外部通信渠道的互联网真正可行的安全性?没有骰子 .

    根据您的使用情况,您可能希望避免将密钥存储在字符串中 .

    如果涉及到生命或金钱,你甚至想要做更多的事情 . 考虑用户可能将客户端安装在公共计算机上,例如网吧 . 查看SecureString以及逐步散列字符并且从不将字符串实际存储在内存中的算法 .

    EDIT:

    由于VM管理内存和垃圾收集的方式以及虚拟内存的工作方式,您可能会冒公共PC上未使用的扇区可能包含纯文本密码 . 当操作系统将虚拟内存交换到磁盘时会发生这种情况 . C#中没有编程方式可以绝对确定它没有发生 . 在这些情况下SecureString和内存固定可帮助您保护.NET客户端(C#和VB) .

相关问题