惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Last Week in AI
Last Week in AI
H
Help Net Security
博客园 - 叶小钗
V
Visual Studio Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - 三生石上(FineUI控件)
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Azure Blog
Microsoft Azure Blog
G
Google Developers Blog
腾讯CDC
MongoDB | Blog
MongoDB | Blog
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
GbyAI
GbyAI
Microsoft Security Blog
Microsoft Security Blog
A
About on SuperTechFans
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
T
The Blog of Author Tim Ferriss
Martin Fowler
Martin Fowler
月光博客
月光博客
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
Vercel News
Vercel News

热爱生活与梦想

迁移LeanCloud的Waline评论数据到TiDB/Neon 25年江浙地区暑假自驾游之感慨 使用阿里云灵码继续完成构建 SSL 证书管理器 亲手给儿子做的棒棒糖摩天轮六一礼物 使用腾讯云 CodeBuddy 构建 SSL 证书管理器 修复代码块默认高度相关缺陷 HugoNexT4.7.2 新功能和升级提示 改善代码块折叠和选中功能 支持Github风格的警告样式 新增音乐短代码功能支持 给文章添加摘要和过期提示功能 回顾24年的过去总结 修复Mathjax行内显示公式的问题 给Hugo文章增加阅读更多跳转的锚点定位功能 Win10隐匿的VPN设置和L2TP连接常见错误 Go语言中“糟糕”的日期时间格式化设计 DaoCloud道客提供的免费Docker镜像代理服务 感谢万能淘宝让自己吃到喜欢的美食 WSL运行时遇到未知异常错误无法使用 MySQL自带客户端直接免密登录操作 Linux系统中删除目录软链接的注意项 Java程序调用外网API时CA问题 如何不关机重启WSL2恢复虚拟服务 在Windows上安装Podman容器平台做虚拟化 记一次无法弹出移动硬盘的记录 为友情链接添加自动检测脚本 重新激活Github的2FA认证 Linux中使用tar压缩命令排除文件 继续小米手环的健康生活之旅 一次意外的“坠机”引发了我对手机保护壳的深思
隐藏的换行符导致Base64加密解密失败
凡梦星尘 · 2024-09-05 · via 热爱生活与梦想

平日里偶尔会在调用API服务时,需要对用户与密码认证信息进行Base64加密处理,一般都用网上的在线工具进行直接操作获取。但是在客户现场环境中并没有互联网访问权限,便只能是寻求其他方法来实现Base64加密操作。起初是使用Python中的base64模块进行加密,只是操作起来较麻烦些,因为不同客户环境不一样而且也不能拷贝外部文件进去,只能是在Python交互模式下手工敲些代码。可是长久以往并不是办法,后来便发现了Linux系统其实大部都自带Base64的模块,于是便开始探索如何在Linux系统中使用Base64模块进行加解密的操作方式。

不过在尝试使用管道命令echo输出后调用base64命令进行加密,比如类似这样的操作命令:echo "ADMIN:123456" | base64,但当用加密认证信息访问API服务时,提示用户认证失败。通过对比之前使用Python的加密方式,发现两种方式加密后的字符串确实是不一样。参考结果如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
root@debian12:/# echo "ADMIN:123456" | base64
QURNSU46MTIzNDU2Cg==
root@debian12:/# python
Python 3.11.2 (main, Aug 26 2024, 07:20:54) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import base64
>>> encry_pswd="ADMIN:123456"
>>> encode_pswd=base64.b64encode(encry_pswd.encode('utf-8'))
>>> print(encode_pswd.decode('utf-8'))
QURNSU46MTIzNDU2

可以看出来这里的两种方式加密的字符串看起来是很相似,但是仔细对比会发现末尾并不一样。一番探索后找到问题的“元凶”竟是因为在使用echo命令输出时,在字符串末尾会自动添加一个换行符,从而改变了加密内容,便导致加密后的字符串不一致。修复的方式就是在echo 命令后面添加一个-n参数,禁止输出时添加换行符。参考如下:

1
2
root@debian12:/# echo -n "ADMIN:123456" | base64
QURNSU46MTIzNDU2

只是每次进行加密操作都要记得输入这个参数,着实还是有点麻烦,于是便想到了使用printf命令来实现,参考如下:

1
2
root@debian12:/# printf "ADMIN:123456" | base64
QURNSU46MTIzNDU2

问题到此总算是完美解决,也推荐使用printf命令来实现Base64加密操作,不仅不再用担心忘记添加-n参数,而且printf命令还有更多丰富的功能可以引用。

注:在此只是简单的加密用户认证信息,并不涉及到大量的信息输出,所以完全不用担心 printf 命令的效率问题。