如何生成散列或使用加密来保护asp.net mvc应用程序中的密钥?

时间:2010-08-31 16:26:18

标签: security asp.net-mvc-2 encryption hash

  编辑1:我想我自己并不清楚   以前,因此无法说出来   更好。所以,我正在创建一个系统   我在哪里提供页面内容   另一个系统通过IFRAME。一个用户   将登录到其他系统和   该系统将设置他们的apiKey和   userKey在我的系统上的cookie中   该访问权限将授予我的   系统。我想加密这些值   这样恶意用户就无法做到   获准进入某人   通过修改值来进行系统化。在那儿   这种类型的.NET标准很好   加密/安全性?你是什​​么   我建议在这种情况下做什么?

大家好, 首先这可能会被问到,但之前我从未实现过散列或加密,所以我只想确保明确表达我的观点。我想对这里需要做的事情有一些了解。

我有几个用户独有的密钥,客户通过iframe传递密钥,并维护会话,我们使用这些值为他们创建cookie。所以,现在我想加密或生成这些值的哈希值它们在网址中可见我不希望用户操纵这些值。

所以,我想我想为这两个键生成一个哈希并在浏览器中显示,以阻止用户输入一些随机值并尝试滥用该系统。我想将这些散列值存储在数据库中,然后与原始值进行比较。

请任何人指导我完成所有我需要做的步骤以及我应该用它来实现它。

4 个答案:

答案 0 :(得分:2)

您说您的数据库正在存储特定用户专用的信息,具体如下:

{ID = 1,User = Bob}
{ID = 2,User = Bob}
{ID = 3,User = Fred}
{ID = 4,User = Bob}
{ID = 5,User = Susan}

如果是这种情况,那么看起来有意义的是不加密URL中的ID,而是验证用户实际上是否可以访问他试图查看的数据。例如,如果Fred已登录并尝试访问?id = 2,则系统将检测到他没有访问权限并且将返回错误页面。但如果Bob登录,他可以访问?id = 2就好了。您可以通过在DB表中添加一个额外的列来指定拥有该特定行的用户。在此特定方案中,ID本身不敏感,因此您无需对其进行加密或混淆。

如果我误解你的情况,请澄清。 :)

答案 1 :(得分:2)

我担心我不能非常清楚地理解你的场景的细节,但我可以说,一般来说,你所寻找的是你传递的数据的“完整性”。

这可以通过消息验证代码提供,如HMAC算法。这里,共享秘密与数据组合并迭代地进行散列。结果随数据一起发送。知道共享密钥的接收者可以对数据执行相同的处理,并查看他们的结果是否与提供的MAC匹配。如果没有,则伪造或更改数据。

不要尝试自己实施HMAC算法。 .NET class library提供了算法的一些变体。

答案 2 :(得分:2)

首先,如果我正确理解您的场景,您不需要哈希,但您需要对这些密钥进行加密。如果您对它们进行哈希处理,您将无法再读取原始值并创建会话cookie。您正在尝试实施跨域单点登录(如果这不是您的情况,我误解了您的方案,您可以忽略我的其余答案)。

我建议您使用机器密钥加密/解密:

加密:

var ticket = new FormsAuthenticationTicket(
    1, // version
    "ticketName", // name of the ticket (it doesn't really matter here)
    DateTime.Now, // issue date
    DateTime.Now.AddMinutes(1), // validity of the ticket
    false, // should the ticket be persistent
    "key1=value1&key2=value2......" // values to encrypt, could be any string
);
string encrypted = FormsAuthentication.Encrypt(ticket);

现在通过线路发送加密的字符串,另一方面解密。使用SSL在加密通道上执行此操作非常重要,以避免可以窃取加密值并尝试强制使用SSL的中间人:

var ticket = FormsAuthentication.Decrypt(encrypted);
if (!ticket.Expired)
{
    // The ticket hasn't expired (< 1min) => use the values
    string keys = ticket.UserData;
    // TODO: Parse and issue cookie
}

要使其正常工作,必须在加密和解密方面使用相同的machine keys


更新:

以下是步骤:

  1. 用户在系统A(域1)
  2. 上进行了身份验证
  3. 系统A决定包含在用户未经过身份验证的iframe系统B(域2)中
  4. 系统A使用机器密钥生成包含用户信息的加密字符串
  5. 系统A向系统B(通过iframe的src属性)发送此加密值
  6. 系统B读取和解密包含用户信息的加密值
  7. 系统B发出身份验证Cookie以指示用户现在已在域2上进行身份验证
  8. 系统B向用户显示经过身份验证的内容
  9. 您已实现跨域单点登录。当然,这种技术不仅限于iframe。

答案 3 :(得分:1)

如果我正确地理解了yoru问题,我认为你的做法是错误的。您的应用应该以这样的方式制作,即弄乱查询字符串甚至发布数据都不应该绕过您的安全。

显示数据纯文本,如果您的安全性正确完成则无关紧要。通过使用散列,加密或任何其他“隐藏”此数据的方法,只能再次保护最基本的用户。

分析您要保护查询字符串的原因以及哪些部分很重要。然后验证服务器端(控制器)上的数据,以确保每个操作都确实正确......除了您认为查询字符串加密/阻塞的安全性之外,还有其他任何事情只会让您处于操作状态。