【问题标题】:Safe Data serialization for Plain HTTP GET & POST communication用于普通 HTTP GET 和 POST 通信的安全数据序列化
【发布时间】:2010-02-01 10:40:24
【问题描述】:

我正在使用客户端的浏览器提交 HTTP 请求。 对于报告生成,securityToken 作为 POST 提交,对于报告下载,用户浏览器需要提交相同的令牌,这次使用 GET。

对于实际表示加密数据的 securityToken,您会推荐什么编码。

我尝试过 BASE64,但失败了,因为 standard 可以包含“+”字符,该字符在 HTTP GET 中被转换为“”(空格)。

然后我尝试了 URL 编码,但这失败了,因为对于 HTTP POST,诸如 %3d 之类的东西在没有翻译的情况下传输,但是当浏览器使用数据进行 HTTP GET 时,%3d 被转换为“=”。

您会推荐什么编码,以允许通过 HTTP POST 和 GET 安全传输而不会误解数据。

环境是Java,Tomcat。

谢谢你, 马克西姆。

【问题讨论】:

    标签: java http encoding http-post http-get


    【解决方案1】:

    十六进制字符串。

    Apache commons-codec 有一个提供此功能的 Hex 类。

    它看起来像这样: http://youraddress.com/context/servlet?param=ac7432be432b21

    【讨论】:

    • 我在想一些比 Hex 更紧凑的东西,比如: BigInteger bi = new BigInteger("STR_GOES_HERE".getBytes()); System.out.println(bi.toString(36));它将输出 a-z0-9 字符范围,唯一的问题是我找不到合适的方法将其转换回字符串,知道吗?
    • Hex 类有encodeHex(..)decodeHex(..) 方法
    • 对不起,我相信我应该通过一个例子更好地解释自己:将“HelloWorld”编码为base16为“48656c6c6f576f726c64”,将其编码为base37为“1jo7hzvcp48urzvo”;十六进制是 20 个字符,Base37 是 16 个字符,这就是我寻求使用这种编码的原因。我的问题是我无法将“1jo7hzvcp48urzvo”转换回“HelloWorld”。帮助将不胜感激。
    • Integer.parseInt("1jo7h", 37); ?
    • 这给出了一个异常 java.lang.NumberFormatException: radix 37 大于 Character.MAX_RADIX。尝试使用 Integer.parseInt("1jo7h", 36);有效,但 AFAIK 这仅适用于整数,我有字符串(参见上面的“HelloWorld”示例)。 Character.MAX_RADIX 是一个很好的方向...
    【解决方案2】:

    好吧,您可以保留 Base64 并使用此解决方案: Code for decoding/encoding a modified base64 URL

    【讨论】:

    • 我认为 Hex 实际上比 Base64 更好 - 它在线上更紧凑。
    猜你喜欢
    • 1970-01-01
    • 2018-01-29
    • 2017-11-06
    • 2011-03-03
    • 2014-09-20
    • 1970-01-01
    • 2023-03-28
    • 2012-07-13
    • 1970-01-01
    相关资源
    最近更新 更多