为什么 Base64.decode 为不同的字符串生成相同的字节数组?

Why do Base64.decode produce same byte array for different strings?

我正在使用 URL 安全的 Base64 编码来编码我随机生成的字节数组。但是我的解码有问题。当我解码两个不同的字符串时(除了最后一个字符外,其他所有字符都相同),它会生成相同的字节数组。例如,对于 "dGVzdCBzdHJpbmr""dGVzdCBzdHJpbmq" 字符串,结果是相同的:

Array(116, 101, 115, 116, 32, 115, 116, 114, 105, 110, 106)

对于encoding/decoding我这样使用java.util.Base64

// encoding...
Base64.getUrlEncoder().withoutPadding().encodeToString(myString.getBytes())
// decoding...
Base64.getUrlDecoder().decode(base64String)

这次碰撞的原因是什么?除最后一个字符外,其他字符是否也可能?我该如何解决这个问题并为每个不同的字符串解码 return 不同的字节数组?

可能这就是 Base64 编码和解码的方式...看看这个 this 是否有帮助。 看下面的描述就知道Base的实际工作了 64.If array string最后有差异,编码后的值会可能反映在同一个地方

您遇到的问题是由于您在 "result"(11 个字节)中的字节数没有完全 "fill" 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:如果没有填充,一些解码器也会尝试解码 "last" 字节,您将得到一个 12 字节的结果(最后一个字节不同)。这就是我发表评论的原因(询问 withoutPadding() 选项是否是个好主意)。但是你的解码器似乎可以处理这个问题。

您显示的数组是 "test strinj" 的 ASCII 表示(参见 http://www.unit-conversion.info/texttools/ascii/),似乎不是任何内容的 base64 表示。

你好像分析错了'result'数组