1

我有一个要加密的字典对象,然后将其放入查询字符串中,然后在另一端解密。

我为此使用 JavaScriptSerializer。现在我已经在同一页面上尝试了这个,它有效。所以我使用的加密/解密扩展方法正在工作。这使我相信查询字符串存在一些问题。

例如

        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.解密字符串行上的此错误。

我不明白发生了什么......我在文本进入查询字符串之前对其进行urlencoding,然后在反序列化之前对其进行urldecoding..

编辑

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

4

2 回答 2

2

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

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

于 2012-04-05T03:03:12.847 回答
1

很可能某些字符不会以您期望的方式往返(即,在这种情况下,“+”往往会变成空格)。

使用 Fiddler(或任何其他 HTTP 调试工具)检查实际发送到服务器/从服务器发送的内容。比检查是否出现“显示”动作的字符串 - 你很可能会看到问题所在。

于 2012-04-05T03:04:09.587 回答