1

我的 ASP.NET MVC 4 网站(作为 Azure Web 角色托管)将一些敏感数据存储在 SQL Server 表中。当用户开始生成数据的工作流时,我从 Rijndael 实现中获取一个随机密钥并将其存储在会话状态中。在会话的整个生命周期中,我使用该密钥对数据库进行往返加密/解密。因此,只有在该会话中运行的代码(或至少可以访问存储在会话状态中的密钥的代码)才能解密数据。

现在我需要允许数据库记录停留一段时间并从不同的会话中访问它们。由于此会话无权访问存储在前一个会话状态中的密钥,因此在我看来,我最好、最简单的做法可能是使用嵌入到我的应用程序代码中的密钥来加密所有数据。

我应该补充一点,我正在努力不使用任何 Azure 挂钩,以便我的网站可以托管在任何 ASP.NET 主机上。

我有两个问题:

  1. 如果我的会话状态方案是<sessionState mode="StateServer" />并且我实际上正在使用多个主机,那么我现有的方案(将我的密钥存储在会话状态中)在 Azure 上是否安全?(请善待......我仍在弄清楚整个 ASP.NET/Azure 的事情。目前我正在使用 InProc 会话状态;我什至还没有尝试让多主机工作。)

  2. 与使用单个内置密钥相比,使用随机的每会话密钥似乎是一种更强大的加密方案。但是,另一方面,整个 SSL 世界的前提是所有通信都由一个嵌入 SSL 证书的私钥保护。我应该担心使用嵌入我的代码的密钥吗?有没有更好的方案 - 类似于我使用每个会话密钥所做的事情?

4

1 回答 1

0

1.

保护会话状态。不幸的是,它不会告诉你它在做什么,但会告诉你很多不该做的事情,这应该会让你产生适当的偏执。

2.

保护静态数据是一个非常困难的问题,你将不得不存储一个密钥,你只需要尽可能地保持它的安全并与你的数据分开。如果您需要对数据进行分段,您可以拥有使用主密钥加密的每个 x(每个用户,等等)的密钥。轮换密钥的能力确实有助于维护安全性,因此您可以超时更换密钥而不会产生任何后果。我移植到 c#keyczar框架有一个简单的键轮换设计。

于 2013-03-26T13:29:39.777 回答