encoding - 解码两个不同的 base64 字符串返回两次相同的字符串

标签 encoding debian base64 basic-authentication dyndns

base64 编码/解码使用确定性算法。因此,给定的输入字符串将始终编码为已知的输出字符串,反之亦然。

使用浏览器访问使用基本身份验证保护的 URL,浏览器将 username:password 对编码为 base64 字符串,并将该字符串放入 HTTP Authorization 请求 header 中。使用 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 操作系统还创建了与 Web 浏览器(在 Windows 上使用)相同的字符串。

更新 2

根据@umläute 的要求,这里有两个演示字符串: Stirng A: bXlkb21haW4uY29tOmRueURucz String B: bXlkb21haW4uY29tOmR5bkRucz 使用在浏览器控制台中解码它们
atob('STRING')

总是给出相同的解码字符串。

最佳答案

在 ddclient 的配置文件中一定有一些不可见的控制字符,可能是由于复制和粘贴...

使用 vi我从文件中删除了内容并手动编写了每一行。现在 ddclient 生成预期的 base64 编码字符串。

我仍然想知道为什么我无法看到带有 vi 的 :set list 的字符命令,但至少现在问题解决了。

关于encoding - 解码两个不同的 base64 字符串返回两次相同的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31171593/

相关文章:

ruby - 将西里尔文本转换为 Base64 并返回

encoding - WP7的WebBrowser.NavigateToString()和文本编码

java - 是否有一种 Java 方法可以将参数集合编码为 URL 查询组件?

unicode - 将普通空格/空格转换为不间断空格?

javascript - C# 编码和 Javascript 解码

grails - 我可以在 Grails 项目之外运行数据库迁移插件脚本吗?

linux - Bash - 运行 grep 返回的命令

c# - 不良 PKCS7 填充错误 : Invalid length 106

ubuntu - 如何为共享库调整 debian 包中的符号文件

android - 发送 PDF HTTP Post 时出现 OutOfMemoryError