一个base64编码的字符串是唯一的吗?

47

我找不到这个问题的答案。如果我使用 Base64 对字符串进行编码,那么基于该字符串的编码输出是否是唯一的?我之所以问这个问题,是因为我想创建一个包含用户信息的令牌,所以我需要确保输出将根据信息而定是唯一的。

例如,如果我对“UnqUserId:987654321 Timestamp:01/02/03”进行编码,那么它是否是唯一的,因此无论我放入什么其他用户ID,都永远不会发生冲突?


2
Base64不是加密。但是,不同的输入字符串将始终编码为不同的Base64编码字符串,而相同的输入字符串将始终编码为相同的Base64编码字符串。它不是哈希,因此输入中的小变化只会导致输出中的小变化。 - Blorgbeard
1个回答

121

虽然晚了两年,但是我们终于来了:

简短的回答是是的,唯一的二进制/十六进制值总是会编码为唯一的base64编码字符串。

但是,多个base64编码的字符串可能表示一个单一的二进制/十六进制值。

这是因为十六进制字节与base64“数字”不对齐。一个十六进制字节由8位表示,而一个base64数字由6位表示。因此,任何不是6位对齐的十六进制值可能具有多个base64表示形式(尽管正确实现的base64编码器应该编码为相同的base64表示形式)。

一个示例是十六进制值“0x433356c1”。该值由32位表示,并且被base64编码为“QzNWwQ==”。然而,这个32位值不是6位对齐的。那么会发生什么?在这种情况下,base64编码器在二进制表示的末尾填充四个零比特,使序列变为36位,从而对齐为6位。

解码时,base64解码器现在必须解码成8位对齐的值。它截断填充的比特并将前32位解码为十六进制值。例如,“QzNWwc==”和“QzNWwQ==”是不同的base64编码字符串,但解码为相同的十六进制值0x433356c1。如果我们仔细观察,我们注意到这两个编码字符串的前32位是相同的:

'QzNWwc==':
010000 110011 001101 010110 110000 011100

'QzNWwQ==':
010000 110011 001101 010110 110000 010000

唯一的区别在于最后四位被忽略。请记住,任何base64编码器不应该生成'QzNWwc =='或任何0x433356c1的其他base64值,而不是'QzNWwQ == ',因为添加的填充字节应始终为零。

总之,可以安全地假定一个唯一的二进制/十六进制值将始终使用正确实现的base64编码器编码为唯一的base64表示形式。只有在生成没有清零填充/对齐字节的base64字符串时,才会在解码期间发生“冲突”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接