当前位置: 首页 > 知识库问答 >
问题:

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

苍烨然
2023-03-14

我找不到答案。如果我用Base64编码一个字符串,那么基于该字符串的编码输出会是唯一的吗?我问这个问题是因为我想创建一个包含用户信息的令牌,所以我需要确保输出是唯一的,这取决于信息。

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

共有1个答案

万俟玉书
2023-03-14

虽然晚了两年,但我们要做的是:

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

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

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

这种错位的一个例子是十六进制值“0x433356c1”。此值由 32 位表示,base64 编码为“QzNWwQ==”。但是,此 32 位值不是 6 位对齐的。那么会发生什么呢?在这种情况下,base64编码器将四个零位焊盘到二进制表示的末端,以使序列36位,从而对齐6位。

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

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

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

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

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

 类似资料:
  • 问题内容: 我运行以下代码: 游乐场: http : //play.golang.org/p/qbkEIZRTPQ 输出: 所需的输出: 为什么base64编码它就像普通的一样? 毕竟,RawMessage的MarshalJSON实现只是返回字节片 问题答案: 在螺母中找到答案 传递给的值必须是正常工作的指针:

  • 它失败了并给出了像贝娄这样的例外。 xml格式与不兼容吗?

  • 我在C#和TSQL中有base64字符串编码/解码函数,我的问题是C#的编码结果与TSQL的编码结果不同。 null 你知道如何匹配结果吗?

  • 问题内容: 我正在使用Base64编码来编码Java中的用户ID字段。 我想知道上面的字符串abc是否包含字符“,:”吗? 当以abc返回Base64编码的字符串时,它是否会包含以下字符? 问题答案: 您不会在Base64编码的字符串中看到任何逗号,冒号或双引号。由于等号用于填充结尾内容,因此您会看到等号。

  • 问题内容: 通过GET参数传递原始base64编码的字符串是否安全? 问题答案: 不,您需要对其进行url编码,因为base64字符串可以包含“ +”,“ =”和“ /”字符,这可能会改变数据的含义-看起来像一个子文件夹。 有效的base64字符如下。

  • 我想将一个字符串编码成并通过套接字传输它,然后解码回来。 下面是我的代码,结果是“77+9x6s=” 有什么想法如何实现这一点吗?