【发布时间】:2013-03-26 05:25:22
【问题描述】:
我的 ASP.NET MVC 4 网站(作为 Azure Web 角色托管)将一些敏感数据存储在 SQL Server 表中。当用户开始生成数据的工作流时,我从 Rijndael 实现中获取一个随机密钥并将其存储在会话状态中。在会话的整个生命周期中,我使用该密钥对数据库进行往返加密/解密。因此,只有在该会话中运行的代码(或至少可以访问存储在会话状态中的密钥的代码)才能解密数据。
现在我需要让数据库记录停留一段时间并从不同的会话中访问它们。由于此会话无法访问存储在前一个会话状态中的密钥,因此在我看来,我最好、最简单的做法可能是使用嵌入我的应用程序代码中的密钥来加密所有数据。
我应该补充一点,我正在努力不使用任何 Azure 挂钩,以便我的网站可以托管在任何 ASP.NET 主机上。
我有两个问题:
如果我的会话状态方案是
<sessionState mode="StateServer" />并且我实际上使用多个主机,我的现有方案(将我的密钥存储在会话状态中)在 Azure 上是否安全? (请善待......我仍在弄清楚整个 ASP.NET/Azure 的事情。目前我正在使用 InProc 会话状态;我什至还没有尝试让多主机工作。)使用随机的每会话密钥似乎是比使用单个内置密钥更强大的加密方案。但是,另一方面,整个 SSL 世界的前提是所有通信都由一个嵌入 SSL 证书的私钥保护。我是否应该担心使用嵌入我的代码的密钥?有没有更好的方案 - 类似于我使用每会话密钥所做的事情?
【问题讨论】:
-
SSL 每次建立连接时都会生成一个新的密钥,公钥仅用于加密密钥,因此可以将其发送到称为密钥交换的服务器。
-
@Despertar:但是如果您的 SSL 私钥被盗,那么加密的密钥交换可能会被窥探,整个方案就会崩溃。我的观点是,这是一个广泛使用的方案示例,该方案依赖于存储在(希望)难以访问的容器中的一个秘密。
-
SSL 提供可选的临时 diffie-hellman (EDH) 密码套件,可提供前向保密。在这些密码套件中,长期公钥(例如 RSA 密钥或 ECDSA 密钥)仅用于验证交换。
标签: asp.net asp.net-mvc encryption