【问题标题】:Base 64 Encoding a SHA-1 Hash in the Bash Shell在 Bash Shell 中对 SHA-1 哈希进行 Base 64 编码
【发布时间】:2012-09-15 03:41:33
【问题描述】:

我有一个 Python 命令可以生成字符串的 SHA-1 哈希的 URL 安全 base-64 编码:

>>> import base64
>>> import sha
>>> base64.urlsafe_b64encode((sha.new("abc").digest()))
'qZk-NkcGgWq6PiVxeFDCbJzQ2J0='

我想在 bash shell 中做同样的事情,但我遇到了问题:

me:~$ echo -n "abc" | sha1sum | sed 's/ .*//' 
a9993e364706816aba3e25717850c26c9cd0d89d
me:~$ echo -n "abc" | sha1sum | sed 's/ .*//' | base64
YTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZAo=

我怀疑这是因为 sha1sum 的打印方式(十六进制格式)。我认为 base64 正在读取 40 个字节,但实际上应该只读取 20 个字节。我尝试通过 iconv 进行管道传输,但没有成功:

me:~$ echo -n "abc" | sha1sum | sed 's/ .*//' 
a9993e364706816aba3e25717850c26c9cd0d89d
me:~$ echo -n "abc" | sha1sum | sed 's/ .*//' | base64
YTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZAo=

我应该在这里做什么才能得到我期望的输出?

提前感谢您的帮助!

【问题讨论】:

  • 从 Python 以十六进制打印 SHA1 不是更简单吗?这是这种特定数据类型的几乎通用的人类可读表示。

标签: bash utf-8 base64 sha


【解决方案1】:

digest() 与 hexdigest() 不同

base64.urlsafe_b64encode((sha.new("abc").hexdigest()))
'YTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZA=='

摘要的文档字符串:

Type:       builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form:<built-in method digest of _hashlib.HASH object at 0x1c88940>
Namespace:  Interactive
Docstring:  Return the digest value as a **string of binary data**.

编辑:尝试:

echo -n "abc"| openssl sha1 -binary | base64
qZk+NkcGgWq6PiVxeFDCbJzQ2J0=

【讨论】:

  • 是的,我明白了。我试图让 Bash 命令输出与 Python 输出相匹配;不是相反。我的 Python 命令中使用的方法不受我控制。
  • 刚刚看到编辑。完美的!这正是我一直在寻找的。谢谢!
  • 那是因为我在 Python 命令中使用了 urlsafe_b64encode() 而不仅仅是 b64encode()。所做的只是用“-”替换“+”字符,用“_”替换“/”字符。
猜你喜欢
  • 2011-09-13
  • 1970-01-01
  • 2018-02-22
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多