通过加密的Querystring传递字典
本文关键字:字典 Querystring 加密 | 更新日期: 2023-09-27 18:29:59
我有一个字典对象,我想加密它,然后把它放在查询字符串中,然后在另一边解密它。
我正在使用JavaScriptSerializer。现在我已经在同一个页面上加载了这个,并且成功了。因此,我使用的加密/解密扩展方法是有效的。这让我相信querystring存在一些问题。
例如
var js = new JavaScriptSerializer();
var d = new Dictionary<string, string>();
d.Add("ID", "123456");
d.Add("Name", "HELLO TEST");
d.Add("Email", "test@email.com");
var s = js.Serialize(d).EncryptString();
var ds = js.Deserialize<Dictionary<string, string>>(s.DecryptString());
@ViewBag.Test = ds["Name"];
在上面的例子中,EncryptString()
和DecryptString()
是我正在使用的扩展方法。这将按预期工作,因此它将提取"Name"
的正确值。
当我将序列化的加密字符串放入querystring,然后尝试对其进行解码时,我遇到了问题
所以在第一页上,我有这样的东西:
var js = new JavaScriptSerializer();
var d = new Dictionary<string, string>();
d.Add("ID", "123456");
d.Add("Name", "HELLO TEST");
d.Add("Email", "test@email.com");
var s = HttpUtility.UrlEncode(js.Serialize(d).EncryptString());
s
然后被用作查询字符串。
在接收页面上,我有这个:
public ActionResult Display(string r)
{
var js = new JavaScriptSerializer();
var decryptedString = HttpUtility.UrlDecode(r).DecryptString();
var s = js.Deserialize<Dictionary<string, string>>(decryptedString);
return View();
}
这会引发一个错误:System.FormatException: Invalid length for a Base-64 char array or string.
This error on the decryptstring line。
我不知道发生了什么…我在文本进入查询字符串之前对其进行URL编码,然后在反序列化之前对其执行URL解码。。
编辑
想通了。。我加密了两次。。。
很可能您不需要对字符串进行UrlDecode,因为MVC在分配r
参数的值之前就已经完成了这一操作。尝试直接解密r
。
当然,我必须发出警告:你在这里所做的似乎是一个非常糟糕的主意。无论你想通过在URL中发送这个加密字典来实现什么,几乎可以肯定有更好的方法来实现
很可能有些字符没有按照您期望的方式往返(即,在这种情况下,"+"往往会变成空格)。
使用Fiddler(或任何其他HTTP调试工具)检查实际发送到/来自服务器的内容。然后检查字符串是否出现在您的"显示"操作中,以确定您是否看到了错误。