为啥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解码