2012-01-23 51 views
2

我有一个现成的asp.net网站,使用母版页构建,我需要隐藏或加密所有在常见位置传递查询字符串值而不会改变很多的代码。使用.net 3.5加密或隐藏Asp.net网站上的QueryString

任何人都可以帮助我这个请..还是有另一种想法,而不是隐藏或加密>>?

谢谢。

+0

你需要什么样的混淆程度?查询字符串参数将始终以一种或另一种形式可见,除非完全消除。 – RedFilter

+0

为了安全起见,我需要混淆所有在页面之间传递的查询字符串值。 –

回答

4

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

+0

加密不是我知道的最好的解决方案,但是还有另外一种解决方案来隐藏页面之间发送的数据。 –

+0

你想把谁隐藏起来?浏览器的用户?或者其他一些实体(例如黑客,中间人,政府实体等)?确保用户可以使用 –

+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等加密技术。

+0

我想你没有明白我的意思..我已经有了之前编写的代码,我想在常见的地方做隐藏或加密,所以我不需要重写代码并找到每个发送查询字符串的地方。 –

+0

@AmrElnashar你将不得不改变一些代码。在这种情况下没有银弹。你*可以*做一些愚蠢的事情,比如为IIS写一个HTTP模块;或者看看是否有商业选择。 – vcsjones