base64 编码/解码使用确定性算法。因此,给定的输入字符串将始终编码为已知的输出字符串,反之亦然。
使用浏览器访问使用基本身份验证保护的 URL,浏览器将用户名:密码对编码为 base64 字符串,并将该字符串放入 HTTP 授权请求标头。使用 Firebug 很容易从网络监视器中读取该编码字符串 - 我们称其为字符串 A。
在树莓(运行 Debian Wheezy)上,我安装了 ddclient 以使用 dyndns 更新我的域的 dns 记录。ddclient 配置提供了与使用浏览器访问 URL 相同的用户名:密码对。客户端甚至尝试访问相同的 URL(使用基本身份验证),但由于身份验证错误,访问失败。在 ddclient 的调试输出中,我可以读取 base64 编码的字符串——我们称之为字符串 B。
出于任何原因,字符串 A 和字符串 B 是不同的!但它们是从相同的用户名:密码对创建的。如果我在 Debian shell 中解码字符串
echo myBase64EncodedStringGoesHere | base64 --decode
或在浏览器控制台中使用 JavaScript
atob('myBase64EncodedStringGoesHere')
结果始终是相同的用户名:密码对,无论我解码字符串 A 还是字符串 B。
我唯一的解释是 ddclient 的 username:password 配置中可能有一些不可见的控制字符,影响了 base64 编码结果。vi
因此,我使用带有命令的编辑器检查了 ddclient 配置
:set list
看起来一切都很好。我难住了。有人有胶水吗?
更新 1
由于@C4stor 的评论,我检查了当我使用我的用户名:密码对并使用 shell 命令对其进行编码时会发生什么
echo username:password | base64
结果,我得到==
了最后带有填充字符的字符串 A。除了填充之外,debian OS 创建了与 Web 浏览器(在 Windows 上使用)相同的字符串。
更新 2
根据@umläute 的要求,这里有两个演示字符串:
在浏览器控制台中使用解码它们
Stirng A: bXlkb21haW4uY29tOmRueURucz
String B: bXlkb21haW4uY29tOmR5bkRucz
atob('STRING')
总是给出相同的解码字符串。