我使用 URL 安全 Base64 编码来对随机生成的字节数组进行编码。但我在解码时遇到问题。当我解码两个不同的字符串(除了最后一个字符之外的所有字符都是相同的)时,它会生成相同的字节数组。例如,对于两者"dGVzdCBzdHJpbmr"
and "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)
这次碰撞的原因是什么?除了最后一个以外的字符也可以吗?我该如何解决这个问题并进行解码以针对每个不同的字符串返回不同的字节数组?
您看到的问题是由于“结果”中的字节数(11 个字节)未完全“填充”Base64 编码字符串的最后一个字符而引起的。
请记住,Base64 将每个 8 位实体编码为 6 位字符。生成的字符串正好需要 11 * 8 / 6 字节,或 14 2/3 个字符。但不能写部分字符。只有前 4 位(或最后一个字符的 2/3)是有效的。最后两位未解码。因此所有:
dGVzdCBzdHJpbmo
dGVzdCBzdHJpbmp
dGVzdCBzdHJpbmq
dGVzdCBzdHJpbmr
所有解码为相同的 11 个字节(116, 101, 115, 116, 32, 115, 116, 114, 105, 110, 106
).
PS:如果没有填充,一些解码器也会尝试解码“最后”字节,并且您将得到 12 字节结果(最后一个字节不同)。这就是我发表评论的原因(询问是否withoutPadding()
选项是个好主意)。但你的解码器似乎可以处理这个问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)