【问题标题】:Is a base64 encoded string unique?base64 编码的字符串是唯一的吗?
【发布时间】:2015-05-24 22:51:15
【问题描述】:

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

例如,如果我对“UnqUserId:987654321 Timestamp:01/02/03”进行编码,这将是唯一的,所以无论我输入什么其他用户 ID,都不会发生冲突?

【问题讨论】:

  • Base64 不是 加密。但是是的,不同的输入字符串将始终编码为不同的 Base64 编码字符串,而相同的输入字符串将始终编码为相同的 Base64 编码字符串。虽然它不是哈希,所以输入的微小变化只会导致输出的微小变化。

标签: encoding base64


【解决方案1】:

晚了两年,但我们开始了:

简短的回答是是的,唯一的二进制/十六进制值将始终编码为唯一的 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 编码器不应为 0x433356c1 生成“QzNWwQ==”以外的任何其他 base64 值,因为添加的填充字节应始终为零。

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

【讨论】:

    猜你喜欢
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 2012-11-13
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多