我有一个字典对象,我想加密,然后把它放在查询字符串中,然后在另一边解密。
我正在使用JavaScriptSerializer。现在我已经在同一页面onload上尝试了这个,并且它有效。所以我正在使用的加密/解密扩展方法正在运行。这让我相信查询字符串会出现一些问题。
e.g。
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"
提取正确的值。
当我将序列化加密字符串放入查询字符串然后尝试解码时,我遇到了问题。
所以在第一页,我有这样的事情:
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.
在decryptstring行上出现此错误。
我不知道发生了什么......我在文本进入查询字符串之前对文本进行了编码,然后在反序列化之前对其进行urldecoding ..
修改
想出来..我正在加密它两次......
答案 0 :(得分:2)
您可能无需对字符串进行UrlDecode,因为MVC会在分配r
参数的值之前完成此操作。尝试直接解密r
。
当然,我必须发出警告:你在这里做的事情似乎是一个非常糟糕的主意。无论你想通过在URL中发送这个加密字典来实现什么,几乎可以肯定有更好的方法来实现它。
答案 1 :(得分:1)
最有可能某些角色没有按预期的方式往返(即“+”在这种情况下往往会成为空间)。
使用Fiddler(或任何其他HTTP调试工具)检查实际发送到服务器或从服务器发送的内容。比检查你的字符串是否“显示”动作 - 你有可能看到错误。