我找不到答案。如果我使用Base64编码字符串,则基于该字符串的编码输出是否唯一?我问是因为我想创建一个包含用户信息的令牌,所以我需要确保输出根据信息是唯一的。
例如,如果我对“ UnqUserId:987654321 Timestamp:01/02/03”进行编码,那么这将是唯一的,因此无论我将其放置在哪个其他用户ID中,都不会发生冲突?
迟了两年,但是我们开始:
简短的答案是,唯一的二进制/十六进制值将始终编码为唯一的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字符串未将填充/对齐字节清零,则“冲突”仅在解码期间发生。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句