两个Base64编码产生相同的解码结果

3

两种编码能够映射到相同的解码结果,这是预期的行为吗?我正在通过对 base64 编码的中间字符串进行健全性检查来排查数字签名问题。

例如,以下是 base64 编码:

R0VUDQoNCg0KRnJpLCAwNCBTZXAgMjAwOSAxMTowNTo0OSBHTVQrMDA6MDANCi8=

并且:

R0VUCgoKRnJpLCAwNCBTZXAgMjAwOSAxMDozMzoyOCBHTVQrMDA6MDAKLw==

两者都解码为:

GET


Fri, 04 Sep 2009 11:05:49 GMT+00:00
/

(将字符转义后,内容为:GET\n\n\n Fri, 04 Sep 2009 11:05:49 GMT+00:00\n/)

第一种编码来自于测试两个在线base64编码器。

第二种编码来自于一个Objective-C base64编码器,可以在这里找到

使用Obj-C编码器生成的结果有问题吗?

5个回答

14

使用Python进行另一个示例以证明字符串不相等:

>>> from base64 import decodestring as d
>>> a = "R0VUDQoNCg0KRnJpLCAwNCBTZXAgMjAwOSAxMTowNTo0OSBHTVQrMDA6MDANCi8="
>>> b = "R0VUCgoKRnJpLCAwNCBTZXAgMjAwOSAxMDozMzoyOCBHTVQrMDA6MDAKLw=="
>>> d(a)
'GET\r\n\r\n\r\nFri, 04 Sep 2009 11:05:49 GMT+00:00\r\n/'
>>> d(b)
'GET\n\n\nFri, 04 Sep 2009 10:33:28 GMT+00:00\n/'
>>> d(a) == d(b)
False

较长的字符串使用CRLF换行,较短的字符串使用纯LF。


+1 对于明确的答案,以及用 Python 编写答案的赞赏。 :-) - Quinn Taylor

8
很明显,编码后的字符串具有与字母数字字符对应的相似模式,并且在对应换行符时不同。因此,差异是因为在“编码”-〉“解码”过程中,软件以不同方式处理换行符(CR(\r)、LF(\n)或CRLF(\r\n)),这就是你会得到这样的结果的原因。
除此之外,没有两种不同的方法可以将给定的字符串编码为Base64,也没有两种不同的方法可以解码有效的Base64编码数据。

4
实际上,它们并不解码为同一件事情。
$ echo 'R0VUCgoKRnJpLCAwNCBTZXAgMjAwOSAxMDozMzoyOCBHTVQrMDA6MDAKLw==' | base64 -d | hexdump 
0000000 4547 0a54 0a0a 7246 2c69 3020 2034 6553
0000010 2070 3032 3930 3120 3a30 3333 323a 2038
0000020 4d47 2b54 3030 303a 0a30 002f          
000002b
$ echo 'R0VUDQoNCg0KRnJpLCAwNCBTZXAgMjAwOSAxMTowNTo0OSBHTVQrMDA6MDANCi8=' | base64 -d | hexdump
0000000 4547 0d54 0d0a 0d0a 460a 6972 202c 3430
0000010 5320 7065 3220 3030 2039 3131 303a 3a35
0000020 3934 4720 544d 302b 3a30 3030 0a0d 002f
000002f

3
正如@sharptooth所建议的那样,第一种情况下的换行符是\r\n,而第二种情况下是\n
>>> base64.b64decode("R0VUDQoNCg0KRnJpLCAwNCBTZXAgMjAwOSAxMTowNTo0OSBHTVQrMDA6MDANCi8=")
'GET\r\n\r\n\r\nFri, 04 Sep 2009 11:05:49 GMT+00:00\r\n/'
>>> base64.b64decode("R0VUCgoKRnJpLCAwNCBTZXAgMjAwOSAxMDozMzoyOCBHTVQrMDA6MDAKLw==")
'GET\n\n\nFri, 04 Sep 2009 10:33:28 GMT+00:00\n/'

2

关键在于 base64 字符串解码为字节序列而非字符。比较每个 base64 字符串生成的字节数组,可以发现差异在于如何处理行终止符——第一个字符串中每个 13 后面都跟着一个 10,而第二个字符串只有一个 10。这是标准的 Windows 和 Unix 行终止符差异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接