隐藏的换行符导致Base64加密解密失败

平日里偶尔会在调用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 命令的效率问题。