【问题标题】:Why does my base64 encoded SHA-1 hash contain 56 chars?为什么我的 base64 编码的 SHA-1 哈希包含 56 个字符?
【发布时间】:2013-12-03 05:33:56
【问题描述】:

也许是一个完全愚蠢的问题,但我无法解决......

首先,我需要使用我的部分提交标记生成一个 SHA-1 哈希。哈希正确,输出为;

0623f7917a1e2e09e7bcc700482392fba620e6a2

接下来,我需要将此哈希编码为 28 个字符的字符串。这是我在运行代码(或使用在线生成器)时遇到困难的地方,我得到了 56 个字符的字符串。我得到的刺痛是;

MDYyM2Y3OTE3YTFlMmUwOWU3YmNjNzAwNDgyMzkyZmJhNjIwZTZhMg==

问题是 1) 是否可以从上面的哈希中获取 28 个字符的字符串?和 2) 怎么……我哪里出错了。

感谢您提供的任何帮助。

【问题讨论】:

  • 你到底需要 28 个字符的字符串做什么?如果您不介意计算相同的一些哈希,您可以只取一个子字符串。但如果你需要一个完全唯一的哈希,你就必须找到另一种方法。
  • 1) 可能。你的目标是什么语言? 2) 十六进制值被编码为文本 ("062..." == 0x30, 0x36, 0x32, ...) 而不是它所代表的大数字。
  • @Jonathan - 我被你的评论难住了。您能否详细说明您是如何得出“MDY”是 062 的字符串表示的结论的?我完全错过了它:/
  • @SteveK MDYy... 是字符串 "0623..." 下的代码点序列 - 48、54、50、51 等 - 以 base-64 表示。虽然0623... 是十六进制,但它存储为字符串("0""9""a""f")。要从 base-16 转换为 base-64,必须首先将字符串解析为数字序列 - 0x6、0x23、0xf7 等。

标签: hash base64 encode sha1


【解决方案1】:

SHA-1 哈希有 20 个字节长,但这些字节不太可能都是可打印字符。 因此,如果我们想向人类显示这 20 个字节,我们必须将它们编码为可打印的字符。

一种方法是hexadecimal,我们将每个字节切成两半,然后用0123456789abcdef 范围内的字符表示每一半(4 位值,数字0-15)。 因此每个字节被编码为 2 个十六进制值,因此我们的 20 字节哈希值被编码为 40 字节的可打印字符。

Hex 计算简单,人类很容易查看编码并计算出字节的实际外观,但它并不是最有效的,因为我们只使用了 95 个 ASCII 可打印字符中的 16 个。

另一种将任意二进制数据编码为可打印字符的方法是Base 64。这样效率更高,在 4 个 base64 值中(平均)编码 3 个字节,但人类解析编码要困难得多。

您看到的行为是由于将 20 字节的哈希值编码为 40 字节的十六进制,然后将 那些 40 字节的十六进制编码为 56 字节(40 / 3 * 4,然后向上取整最接近的 4 个字节)的 base64 数据。

您需要将原始哈希字节(如果可用)直接编码为 base64,或者在编码为 base64 之前将十六进制值解码为字节。

【讨论】:

    猜你喜欢
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多