5

将 json 数组编码为可在 URL 查询字符串中使用的字母数字字符串的最佳方法是什么?

我需要一些简单但不容易破解的东西。我已通读所有加密和解密文档。

我需要加密一个 json 数组 Eg:{"firstName":"John","lastName":"Doe"}到类似的东西a14iw58swd33s541dg2k58kv3s4gvkjsdf33s9f3,所以它可以用于像http://www.example.com/?v=a14iw58swd33s541dg2k58kv3s4gvkjsdf33s9f3.

我稍后会解密这个服务器端。因为它是 URL 的一部分,所以我不能有类似的东西ȃZ Vì§n‹ØfjÒ šçæ¹ä¯

什么是一种简单而安全的方法来做到这一点?

4

5 回答 5

8
  1. 使用您认为合适的任何加密函数进行加密,这将产生二进制数据。
  2. 运行二进制数据base64_encode以获取纯 ASCII 字符串。
  3. ???
  4. 利润!
  5. 颠倒上述步骤。
于 2013-04-29T05:32:43.160 回答
2

1) 使用对称密码对其进行加密,例如 AES。您使用的密钥不应该在任何公共代码(javascript等)中看到

2) 通过base64编码运行encruption的结果,使其只包含可打印的字符。

3) 反过来,base64 解码然后使用相同的密钥和算法解密。

于 2013-04-29T05:33:44.443 回答
2

您为什么不直接使用您似乎已经研究过的强大的 PHP 加密方法,并简单地对结果进行编码?让您通过 URL 毫无问题地传递它,但您不会在尝试获取使用 URL 友好字符集的内容时将自己锁定在特定或更弱的加密方法中。

<?php
$ciphertext = /* some encryption code here */

$url_string = urlencode( base64_encode ($ciphertext));
?>
于 2013-04-29T05:39:18.650 回答
1

如果我没看错问题,解决方案应该只产生字母数字字符。Base64 不符合该要求,因为它使用 2 个额外字符进行编码。

如前所述,您应该首先使用任何合适的加密算法,但随后您需要一个 base62 编码器和解码器。网上有几个。这是一个:https ://gist.github.com/Synchro/1139429

但是,提问者的示例不包括大写字母。如果只需要小写字母,则需要 base36 编码。

另一方面,提问者询问什么是适合 URL 的。您可以使用 base64,但必须使用特殊情况,确保可以使用多余的字符。一些 base64 实现包括 '/' 和 '+' 作为额外的 2 个字符,并以 '=' 结尾。您可以将它们更改为“_”和“-”,并丢弃“=”。请参阅此处的加密和解密函数,并注意 blnBase64 标志:

https://github.com/qcubed/framework/blob/master/includes/qcubed/_core/framework/QCryptography.class.php#L116

于 2015-12-11T20:27:40.130 回答
0

注意:通过 url 传递数据时限制为 1024 字节。因此,如果您的加密字符串被截断(即使是 1 个字符),它也不会正确解密。

于 2013-04-29T05:43:30.420 回答