使用.net 3.5在Asp.net网站上加密或隐藏QueryString

时间:2012-01-23 15:12:00

标签: asp.net encryption query-string

我有一个现有的asp.net网站,它使用母版页构建,我需要隐藏或加密所有传递查询字符串值,而不需要更改大量代码。

任何人都可以帮我解决这个问题吗?或者是否有其他想法而不是隐藏或加密>>?

感谢。

2 个答案:

答案 0 :(得分:7)

克里斯在回答中说的是绝对正确的。如果合适,我会接受这个答案。

第一个问题是,如果您将查询字符串隐藏在用户之外,是否需要才能使用查询字符串?也许像Session State这样的东西最好避免用户在第一时间看到它。

但是,除此之外 - 也许你有一个要求你无法解决的问题,你必须自己使用查询字符串。

您可以加密查询字符串,在您的情况下我会使用DPAPI,因此您不必担心密钥管理等麻烦事项。以下是一个示例用法:

    public static string Encrypt(string val)
    {
        var bytes = System.Text.Encoding.UTF8.GetBytes(val);
        var encBytes = System.Security.Cryptography.ProtectedData.Protect(bytes, new byte[0], System.Security.Cryptography.DataProtectionScope.LocalMachine);
        return Convert.ToBase64String(encBytes);
    }


    public static string Decrypt(string val)
    {
        var bytes = Convert.FromBase64String(val);
        var encBytes = System.Security.Cryptography.ProtectedData.Unprotect(bytes, new byte[0], System.Security.Cryptography.DataProtectionScope.LocalMachine);
        return System.Text.Encoding.UTF8.GetString(encBytes);
    }

您必须添加对System.Security程序集的引用并导入名称空间System.Security.Cryptography

以下是如何在页面中使用它的示例:

Response.Redirect("~/somepage.aspx?data=" + Server.UrlEncode(Encrypt("SomeSensitiveData")));

并解密它:

var data = Decrypt(Request.QueryString["data"]);

您可以使用它来加密查询字符串值,例如Encrypt并在需要解释查询字符串的页面上使用Decrypt

除了SSL之外,您还可以使用它;这是一个好主意。这也意味着用户将无法看到查询字符串值。

使用DPAPI有一些警告。一个是它与负载平衡器不匹配。您必须使用其他东西,或设置负载均衡器以使用粘性会话。另一个是,如果他们用加密的查询字符串值为页面添加书签;并且您移动到另一台服务器,然后所有书签都将包含服务器现在无法解密的加密查询字符串。

如果需要保留查询字符串(例如用于书签),并且它不仅仅是“临时”使用,那么您需要提供一个公共密钥,将其保存在安全的地方,然后执行使用AES加密自己。

答案 1 :(得分:4)

为什么要加密查询字符串?如果您尝试将敏感信息从浏览器发送到服务器,请使用SSL。如果您尝试自己加密,您必然会以某种微妙的方式失败。不要重新发明轮子。