几年前,当我第一次接触 ASP.net 和 .NET Framework 时,我构建了一个非常简单的在线文件存储系统。 该系统使用 Rijndael 加密来存储服务器硬盘上加密的文件,并使用 HttpHandler 来解密并将这些文件发送到客户端。
作为我第一个使用 ASP.net 和数据库的项目,我不太了解整个事情是如何工作的(以及落入 same trap described by Jeff Atwood on this subject ),我决定将新生成的 key 和 IV 与每个文件一起存储数据库中的条目。
为了让事情更清楚一点,加密只是为了保护文件不被直接访问服务器,并且 key 不是由用户输入的密码生成的。
我的问题是,假设我不想为所有文件保留一个 key ,我应该如何存储加密 key 以获得最佳安全性?什么被认为是最佳实践? (即:在不同的服务器上,在纯文本文件上,加密)。
另外,这种加密算法中的初始化向量是用来做什么的?它在系统中应该是恒定的吗?
最佳答案
key 应该受到保护并保密,就这么简单。实现则不然。 key 管理系统被值得信赖的供应商以高价出售,因为解决问题是困难。
您当然不想为每个用户使用相同的 key , key 使用的次数越多,就越“容易”破解它,或者至少会泄露一些信息。 AES 是一种分组密码,它将数据分成多个 block ,并将最后一个 block 加密的结果输入到下一个 block 中。初始化向量是算法的初始输入,因为在起点没有什么可以开始的。使用具有相同 key 的随机 IV 可以降低信息泄露的风险 - 对于加密的每条数据来说,它应该是不同的。
如何存储 key 取决于您的系统的架构。我刚刚完成了一个 KMS,其中 key 远离主系统,并且加密和解密功能通过 WCF 公开。您以纯文本形式发送并获取对 key 的引用和返回的密文 - 这样 KMS 负责系统中的所有加密。对于您的情况来说,这可能有点过分了。如果用户在您的系统中输入密码,那么您可以使用它来生成 key 对。然后,该 key 对可用于加密该用户的 key 存储 - XML、SQL 等,并用于解密用于保护数据的每个 key 。
如果不了解更多有关系统配置方式或其用途的信息,除了“必须保护 key ,不得重复使用 key 和 IV”之外,很难提出其他建议。
关于asp.net - AES 加密和 key 存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2037021/