通过加密的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解码。。

编辑

想通了。。我加密了两次。。。

通过加密的Querystring传递字典

很可能您不需要对字符串进行UrlDecode,因为MVC在分配r参数的值之前就已经完成了这一操作。尝试直接解密r

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

很可能有些字符没有按照您期望的方式往返(即,在这种情况下,"+"往往会变成空格)。

使用Fiddler(或任何其他HTTP调试工具)检查实际发送到/来自服务器的内容。然后检查字符串是否出现在您的"显示"操作中,以确定您是否看到了错误。