【问题标题】: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 相当..

标签: mysql perl base64


【解决方案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。

【讨论】:

    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多