为啥mysql和perl base64字符串编码不同?

Posted

技术标签:

【中文标题】为啥mysql和perl base64字符串编码不同?【英文标题】:Why mysql and perl base64 string encoding is different?为什么mysql和perl base64字符串编码不同? 【发布时间】:2020-03-15 01:41:18 【问题描述】:
#!/usr/bin/env perl
use Digest;
say Digest->new( 'SHA-1' )->add('test')->b64digest; # qUqP5cyxm6YcTAhz05Hph5gvu9M


SELECT TO_BASE64(SHA1('test')); # YTk0YThmZTVjY2IxOWJhNjFjNGMwODczZDM5MWU5ODc5ODJmYmJkMw==

因此,相同的 ASCII 字 test 在 Perl 中编码为 qUqP5cyxm6YcTAhz05Hph5gvu9M,在 mysql 中编码为 YTk0YThmZTVjY2IxOWJhNjFjNGMwODczZDM5MWU5ODc5ODJmYmJkMw==

为什么?

【问题讨论】:

接缝/感觉像 Perl 很可能会从 Digest->new( 'SHA-1' )->add('test') 中返回 RAW 字节,而不是像 MySQL 使用 SHA1() 那样提供十六进制数字... 是的,就是这样:perl -MDigest -MMIME::Base64 -E 'say encode_base64(Digest->new("SHA-1")->add("test")->hexdigest)' -> YTk0YThmZTVjY2IxOWJhNjFjNGMwODczZDM5MWU5ODc5ODJmYmJkMw== @RaymondNijland 你应该这样回答。 @RaymondNijland 正确的猜测。你应该为此获得荣誉。 “正确的有根据的猜测。你应该得到它的荣誉” @Shawn 很公平,但我发现有效的答案需要与代码一起存在,否则它不是真正的答案.. 无论如何我不能在 Perl 中编程,因为我从来没有这样做过,因为 Perl 接缝/感觉与 php 或 Python 相当.. 【参考方案1】:

正如 Raymond 所指出的,您正在查看两种不同计算的结果。

您的 perl 打印出 "test" 的 base64 编码 SHA-1 摘要。您的 MySQL 查询采用 base16 编码的 SHA-1 摘要 "test",然后 base64 对该字符串进行编码。

考虑一个与SELECT 执行相同两个步骤的 perl 单行代码:

$ perl -MDigest -MMIME::Base64 -E 'say encode_base64(Digest->new("SHA-1")->add("test")->hexdigest)'
YTk0YThmZTVjY2IxOWJhNjFjNGMwODczZDM5MWU5ODc5ODJmYmJkMw==

还有MySQL query

SELECT to_base64(unhex(sha1('test')))

它给出了qUqP5cyxm6YcTAhz05Hph5gvu9M=,就像你的 perl 但添加了填充。

不过,我会坚持使用 base16/hex 版本,因为这是人们习惯于在摘要中看到的内容:a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 表示 "test" 的 SHA-1。

【讨论】:

以上是关于为啥mysql和perl base64字符串编码不同?的主要内容,如果未能解决你的问题,请参考以下文章

Python和Mysql:base64编码和解码字符串,短信sms解码

如果输入长度不能被 3 整除,为啥 base64 编码需要填充?

nodejs base64 的json为啥会有空格

Perl/MIME 编码文本问题

为啥要用base64编码来保存图片?

在 BASE64 中对每个字符串进行编码以存储在 Mysql 中是不是很好?