我有一个现有的asp.net网站,它使用母版页构建,我需要隐藏或加密所有传递查询字符串值,而不需要更改大量代码。
任何人都可以帮我解决这个问题吗?或者是否有其他想法而不是隐藏或加密>>?
感谢。
答案 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。如果您尝试自己加密,您必然会以某种微妙的方式失败。不要重新发明轮子。