AES加密和密钥存储?

GeR*_*ReV 11 asp.net encryption

几年前,当我第一次被引入ASP.net和.NET Framework时,我构建了一个非常简单的在线文件存储系统.该系统使用Rijndael加密来存储服务器硬盘上加密的文件,并使用HttpHandler解密并将这些文件发送到客户端.

作为我的第一个使用ASP.net和数据库的项目之一,我不了解整个事情是如何工作的(以及陷入Jeff Atwood在这个主题上描述相同陷阱),我决定将新生成的密钥和IV存储在一起与数据库中的每个文件条目.

为了使事情更加清晰,加密只是为了保护文件不被直接访问服务器,并且密钥不是由用户输入的密码生成的.

我的问题是,假设我不想为所有文件保留一个密钥,我应该如何存储加密密钥以获得最佳安全性?什么是最佳做法?(即:在不同的服务器上,在纯文本文件上,加密).

此外,这种加密算法中使用的初始化向量是什么?它应该在系统中保持不变吗?

blo*_*art 12

密钥应该受到保护并保密,简单.实施不是.密钥管理系统由可靠的供应商以大量资金出售,因为解决问题很困难.

您当然不希望为每个用户使用相同的密钥,使用的密钥越多,它就越容易破坏它,或者至少有一些信息泄漏.AES是块密码,它将数据拆分为块,并将最后一个块加密的结果提供给下一个块.初始化向量是算法的初始提要,因为在起点处没有任何内容可以开始.使用具有相同密钥的随机IV会降低信息泄露的风险 - 对于每个加密的数据,它应该是不同的.

如何存储密钥取决于系统的架构方式.我刚刚完成了一个KMS,其中密钥远离主系统,加密和解密的功能通过WCF公开.您发送纯文本并获取对密钥和加密文本的引用 - 这样KMS负责系统中的所有加密.在您的情况下,这可能是矫枉过正的.如果用户在系统中输入密码,则可以使用该密码生成密钥对.然后,此密钥对可用于加密该用户的密钥存储区 - XML,SQL,等等,并用于解密用于保护数据的每个密钥.

如果不了解您的系统配置方式或其目的,除了"必须保护密钥,密钥和IV不得重复使用"之外,很难推荐其他任何内容.

  • 次要观察:"AES是块密码,它将数据拆分成块,并将最后一个块加密的结果提供给下一个块." 您正在描述安全使用AES的[CBC](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher-block_chaining_.28CBC.29)*a*方法.还有其他安全解决方案 - 并非都需要初始化矢量. (2认同)

Rob*_*ell 5

http://web.archive.org/web/20121017062956/http://www.di-mgt.com.au/cryptoCreditcard.html上有一篇非常好的文章,其中涵盖了 IV 和加盐问题以及上面提到的欧洲央行的问题。

诚然,它仍然没有完全涵盖“我在哪里存储密钥”,但在阅读和消化它之后,希望它不会成为解决方案的巨大飞跃......

  • 对于懒惰的人 - http://web.archive.org/web/20121017062956/http://www.di-mgt.com.au/cryptoCreditcard.html (2认同)