簡體   English   中英

為什么 mysql 和 perl base64 字符串編碼不同?

[英]Why mysql and perl base64 string encoding is different?

#!/usr/bin/env perl
use Digest;
say Digest->new( 'SHA-1' )->add('test')->b64digest; # qUqP5cyxm6YcTAhz05Hph5gvu9M


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

因此,在 Perl 和YTk0YThmZTVjY2IxOWJhNjFjNGMwODczZDM5MWU5ODc5ODJmYmJkMw==中編碼為qUqP5cyxm6YcTAhz05Hph5gvu9M的相同 ASCII 字test

為什么?

正如雷蒙德所指出的,您正在查看兩種不同計算的結果。

您的 perl 打印出 base64 編碼的 SHA-1 摘要"test" 您的 MySQL 查詢采用 base16 編碼的"test" SHA-1 摘要,然后 base64 對該字符串進行編碼。

考慮一個 perl 單線,它執行與SELECT相同的兩個步驟:

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

MySQL 查詢

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

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

不過,我會堅持使用 base16/hex 版本,因為這是人們習慣於在摘要中看到的內容: a94a8fe5ccb19ba61c4c0873d391e987982fbbd3用於"test"的 SHA-1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM