我使用URL安全的Base64编码来编码我的随机生成的字节数组。但我在解码时遇到问题。当我解码两个不同的字符串(除了最后的字符都相同),它会产生相同的字节数组。例如,对于既"dGVzdCBzdHJpbmr"
和"dGVzdCBzdHJpbmq"
字符串的结果是一样的:为什么Base64.decode为不同的字符串产生相同的字节数组?
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()'选项是个好主意吗? – haraldK
基本上,它*无关紧要,如果相同的数组可以用两种不同的方式编码。重要的是,如果您接受一个数组,对其进行编码,然后对其进行解码,那么您将获得相同的数组。 –
这并不是说真的很有趣,你有两个字符串都是相同的。 :-)很确定这只是最后有未使用位的问题(因为Base64跨越字节边界对八位字节进行编码),但我必须确定这些位。 –