通过加密的查询字符串传递字典

时间:2012-04-05 02:56:56

标签: c# asp.net-mvc asp.net-mvc-3 serialization deserialization

我有一个字典对象,我想加密,然后把它放在查询字符串中,然后在另一边解密。

我正在使用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 ..

修改

想出来..我正在加密它两次......

2 个答案:

答案 0 :(得分:2)

您可能无需对字符串进行UrlDecode,因为MVC会在分配r参数的值之前完成此操作。尝试直接解密r

当然,我必须发出警告:你在这里做的事情似乎是一个非常糟糕的主意。无论你想通过在URL中发送这个加密字典来实现什么,几乎可以肯定有更好的方法来实现它。

答案 1 :(得分:1)

最有可能某些角色没有按预期的方式往返(即“+”在这种情况下往往会成为空间)。

使用Fiddler(或任何其他HTTP调试工具)检查实际发送到服务器或从服务器发送的内容。比检查你的字符串是否“显示”动作 - 你有可能看到错误。