簡體   English   中英

字符串 -> SHA -> base64,通過 cmd 工具 (openssl/xxd/base64) 的 3 種方式和 3 種不同的結果為什么?

[英]String -> SHA -> base64, 3 ways and 3 different results via cmd tools (openssl/xxd/base64) why?

method1:
$echo -n "The quick brown fox jumps over the lazy dog" | openssl sha1 | base64
MmZkNGUxYzY3YTJkMjhmY2VkODQ5ZWUxYmI3NmU3MzkxYjkzZWIxMgo=

method2:
$ echo -n "The quick brown fox jumps over the lazy dog" | openssl sha1 | xxd -r -p | base64
L9ThxnotKPzthJ7hu3bnORuT6xI=

method3:
echo -n "The quick brown fox jumps over the lazy dog" | openssl sha1 | xxd -b -p | base64
MzI2NjY0MzQ2NTMxNjMzNjM3NjEzMjY0MzIzODY2NjM2NTY0MzgzNDM5NjU2NTMxNjI2MjM3MzY2NTM3CjMzMzkzMTYyMzkzMzY1NjIzMTMyMGEK

我基本上是在嘗試對輸入字符串進行校驗和The quick brown fox jumps over the lazy dog via sha1 as a checksum 然后 base64 結果我有上面的兩種方法,我認為method2是正確的答案但我必須額外在我再次將其輸入 base64 之前通過xxd -r和純格式-p將十六進制轉換回二進制的步驟,為什么我必須執行此額外步驟?

我在任何地方都找不到 base64 cmd 工具期望輸入為二進制? 但是讓我們假設當我明確地將它轉換為二進制文件並通過mehod3 xxd -b option將其提供給 base64 時,結果又不同了。

如果它是在我們可以完全控制的編程語言中,這可能會更容易,但是通過一些 cmd 工具它有點令人困惑,有人可以幫我解釋一下嗎?

這里有三個不同的結果,因為您將三個不同的字符串傳遞給base64

根據你關於base64的問題,希望輸入是二進制的,@chepner 就在這里:

所有數據都是二進制的; text 只是一個 stream 字節,表示文本的編碼(ASCII、UTF-8 等)。

中間步驟

為了清楚起見,讓我們將共享命令存儲在一個變量中。

$ msg='The quick brown fox jumps over the lazy dog'
$ sha_val="$(printf "$msg" | openssl sha1 | awk '{ print $2 }')"
$ printf "$sha_val"
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12

有幾點需要注意:

  • 使用 printf 因為它更一致,尤其是當我們比較字節和哈希值時。
  • 管道傳輸到awk '{ print $2 }'作為 openssl 可能會加上(stdin)=

比較字節

我們可以使用 xxd 來比較每個字節,使用-c 1000來使用 1000 字符的行(即不要為 < 1000 字符的字符串添加換行符)。 這對於 method2 中的 output 這樣的字符串很有用,其中有無法打印的控制字符。

方法一

這是 sha 值的十六進制表示。 例如,sha output 中的第一個2在這個結果中是32 ,因為 hex 32 <=> dec 50 <=> ASCII/UTF-8 "2"。 如果這令人困惑,請查看ASCII 表

$ printf "$sha_val" | xxd -p -c 1000
32666434653163363761326432386663656438343965653162623736653733393162393365623132

方法二

這個 output 與 $sha_val 完全相同,因為我們正在從十六進制轉換為 ASCII 二進制,然后用 xxd 轉換回來。 請注意,base64 不需要將 sha 值從十六進制轉換為二進制。

$ printf "$sha_val" | xxd -r -p | xxd -p -c 1000
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12

方法三

xxd 的-p選項覆蓋了-b選項,因此xxd -b -p <=> xxd -p

$ printf "$sha_val$" | xxd -p -c 1000 | xxd -p -c 1000
33323636363433343635333136333336333736313332363433323338363636333635363433383334333936353635333136323632333733363635333733333339333136323339333336353632333133323061

如您所見,base64 生成三個不同的字符串,因為它接收三個不同的字符串。

暫無
暫無

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

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