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

use*_*127 18 base64 encoding

我找不到答案.如果我用Base64编码一个字符串,编码输出是否会根据字符串唯一?我问,因为我想创建一个包含用户信息的令牌,所以我需要确保输出将是唯一的,具体取决于信息.

例如,如果我编码"UnqUserId:987654321时间戳:01/02/03"这将是唯一的,所以无论我把它放在哪里的其他用户ID永远不会发生碰撞?

sea*_*ano 52

迟了两年,但我们走了:

简短的回答是肯定的,唯一的二进制/十六进制值将始终编码为唯一的base64编码字符串.

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

这是因为十六进制字节与base64'digits'不对齐.单个十六进制字节由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
Run Code Online (Sandbox Code Playgroud)

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

总之,可以安全地假设使用正确实现的base64编码器,唯一的二进制/十六进制值将始终编码为唯一的base64表示.如果生成base64字符串而不归零填充/对齐字节,则仅在解码期间发生"冲突".

  • 感谢像你这样的人甚至在"回答接受"问题上的细节!你的结论是正确的 - 如果编码(填充)有松懈,那就是错误的解码:) (3认同)
  • 这应该是公认的答案。我正在联系 OP ;) (3认同)