我无法找到答案。如果我用Base64编码一个字符串,编码输出是否会根据字符串唯一?我问,因为我想创建一个包含用户信息的令牌,所以我需要确保输出将是唯一的,具体取决于信息。
例如,如果我编码" UnqUserId:987654321时间戳:01/02/03"这将是独特的,所以无论我把它放在哪里,其他用户都不会发生碰撞?
答案 0 :(得分:36)
迟了两年,但我们走了:
简短答案是是的,唯一的二进制/十六进制值将始终编码为唯一的base64编码字符串。
但是,多个base64编码的字符串可能代表单个二进制/十六进制值。
这是因为十六进制字节未与base64'数字'对齐。单个十六进制字节由8位表示,而单个base64数字由6位表示。因此,任何非6位对齐的 的十六进制值都可以具有多个base64表示形式(尽管正确实现的base64编码器应编码为相同的base64表示形式)。
这种错位的一个例子是十六进制值' 0x433356c1'。该值由32位表示,base64编码为&n; 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 =='或者除了' QzNWwQ =='之外的0x433356c1的任何其他base64值。因为添加的填充字节应该始终为零。
总之,可以安全地假设使用正确实现的base64编码器,唯一的二进制/十六进制值将始终编码为唯一的base64表示。 A'碰撞'只有在生成base64字符串而不归零填充/对齐字节时才会在解码期间发生。