【发布时间】:2015-04-29 10:38:51
【问题描述】:
我正在使用 URL 安全 Base64 编码来编码我的随机生成的字节数组。但是我在解码时遇到了问题。当我解码两个不同的字符串(除了最后一个字符之外的所有字符都是相同的)时,它会产生相同的字节数组。例如,对于 "dGVzdCBzdHJpbmr" 和 "dGVzdCBzdHJpbmq" 字符串,结果是相同的:
Array(116, 101, 115, 116, 32, 115, 116, 114, 105, 110, 106)
对于编码/解码,我以这种方式使用java.util.Base64:
// encoding...
Base64.getUrlEncoder().withoutPadding().encodeToString(myString.getBytes())
// decoding...
Base64.getUrlDecoder().decode(base64String)
这次碰撞的原因是什么?是否也可以使用除最后一个以外的字符?我该如何解决这个问题并让解码为每个不同的字符串返回一个不同的字节数组?
【问题讨论】:
-
您确定
withoutPadding()选项是个好主意吗? -
从根本上说,如果同一个数组可以用两种不同的方式编码,那没关系。重要的是,如果您获取一个数组,对其进行编码,然后对其进行解码,您会得到相同的数组。
-
这并不是说你有两个相同的字符串并不有趣。 :-) 很确定这只是最后有未使用的位的问题(因为 Base64 跨越字节边界对八位字节进行编码),但我必须确定这些位。
-
@haraldK 我用它来删除末尾的尾随“=”字符。实际上,我尝试了填充,结果是一样的。
标签: java encoding base64 decoding