gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 01:42:19 25 4
gpt4 key购买 nike

我正在使用 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)

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

最佳答案

您看到的问题是由于“结果”中的字节数(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() 选项是否是个好主意)。但是您的解码器似乎可以处理这个问题。

关于java - 为什么 Base64.decode 会为不同的字符串生成相同的字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29941270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com