几年前,当我第一次被介绍到ASP.net和.NET Framework时,我构建了一个非常简单的在线文件存储系统。 该系统使用Rijndael加密来存储服务器硬盘上加密的文件,使用HttpHandler解密并将这些文件发送到客户端。
作为我的第一个使用ASP.net和数据库的项目之一,不了解整个事情是如何工作的(以及落到same trap described by Jeff Atwood on this subject),我决定将新生成的密钥和IV存储在一起数据库中的每个文件条目。
为了使事情更加清晰,加密只是为了保护文件不被直接访问服务器,并且密钥不是由用户输入的密码生成的。
我的问题是,假设我不想为所有文件保留一个密钥, 应 我如何存储加密密钥以获得最佳安全性?什么是最佳做法? (即:在另一台服务器上,在纯文本文件上加密)。
此外,这种加密算法中使用的初始化向量是多少?它应该在系统中保持不变吗?
答案 0 :(得分:12)
密钥应该受到保护并保密,简单。实施不是。密钥管理系统由可靠的供应商以大量资金出售,因为解决问题很难。
您当然不希望为每个用户使用相同的密钥,使用的密钥越多,它就越容易破坏它,或者至少有一些信息泄漏。 AES是块密码,它将数据拆分为块,并将最后一个块加密的结果提供给下一个块。初始化向量是算法的初始提要,因为在起点处没有任何内容可以开始。使用具有相同密钥的随机IV会降低信息泄露的风险 - 对于每个加密的数据,它应该是不同的。
如何存储密钥取决于系统的架构方式。我刚刚完成了一个KMS,其中密钥远离主系统,加密和解密的功能通过WCF公开。您发送纯文本并获取对密钥和加密文本的引用 - 这样KMS负责系统中的所有加密。在您的情况下,这可能是矫枉过正的。如果用户在系统中输入密码,则可以使用该密码生成密钥对。然后,此密钥对可用于加密该用户的密钥存储区 - XML,SQL,等等,并用于解密用于保护数据的每个密钥。
如果不了解您的系统配置方式或其目的,除了“必须保护密钥,密钥和IV不得重复使用”之外,很难推荐其他任何内容。
答案 1 :(得分:3)
作为一个非常好的解决方案,您可以将Key / IV对存储在表格中:
ID Key IV
skjsh-38798-1298-hjj FHDJK398720== HFkjdf87923==
保存加密值时,请保存ID和随机Salt值。
然后,当您需要解密该值时,使用id和存储在数据中的salt查找key / iv对。
您需要确保密钥存储周围有一个良好的安全模型。如果使用SQL Server,请不要向从应用程序访问数据库的用户授予SELECT权限。你不想让别人访问整个表格。
答案 2 :(得分:3)
在http://web.archive.org/web/20121017062956/http://www.di-mgt.com.au/cryptoCreditcard.html上有一篇关于此问题的非常好的文章,其中涵盖了IV和腌制问题以及上文提到的欧洲央行的问题。
诚然,它仍然没有完全涵盖“我在哪里存放钥匙”,但是在阅读并消化它之后,希望这对解决方案来说不会是一个巨大的飞跃....