【问题标题】:Why base64 a sha1/sha256 hash?为什么 base64 是一个 sha1/sha256 哈希?
【发布时间】:2012-03-28 10:33:31
【问题描述】:

谁能告诉我为什么亚马逊想要一个 base64 的 hmac-sha1/sha256 哈希?

http://docs.amazonwebservices.com/AmazonSimpleDB/latest/DeveloperGuide/HMACAuth.html

我知道 base64 是用 ascii 表示二进制日期,但 sha1/sha256 已经是 ascii - 我的意思是它唯一的十六进制。

谢谢

提莫

【问题讨论】:

    标签: amazon-web-services base64 sha1 sha256 hmac


    【解决方案1】:

    那些散列不是 ASCII——你看到十六进制数字的原因是因为你用来生成它们的软件将摘要的二进制输出转换成十六进制数字的 ASCII 字符串。

    例如,MD5 摘要将填充一个 16 字节的数组。也可以将其表示为 32 个字符的字符串,但摘要的最基本形式仍然是字节数组。

    当您将字节数组更改为十六进制字符串时,您需要 8 位(一个完整字符)来表示每 4 位数据。虽然不经常这样调用,但您可以说它使用“base16”编码,因为您一次抓取 4 位并将它们映射到 16 个字符的字母表。

    另一方面,Base64 一次抓取 6 位并将它们映射到 64 个字符的字母表。这意味着您需要 8 位(同样是一个完整字符)来表示每 6 位数据,其中浪费了 base16 的一半。 base16 编码的字符串总是比原始字符串大一倍; base64 编码的字符串只有三分之四大。对于 SHA256 哈希,base16 处理 64 个字节,但 base64 处理大约 43 个字节。

    【讨论】:

    • @zneak 节省空间是在哈希上使用 Base 64 编码的原因。难道不是如果我们需要发送此哈希,我们需要将该哈希表示为文本,而 Base64 通过将二进制数据限制为一组 64 个大多数常见编码中大部分重叠的字符?
    • @zneak 我的意思是在任何计算机上给散列一个可呈现的形式。
    • @whokares,十六进制编码和 base64 都会将散列转换为有效的 ASCII 字符串。如果您只关心这一点,那么任何一个都可以。但是,十六进制字符串(其中每个字节表示为 0 和 F 之间的两个 ASCII 字符)将占用原始空间的两倍,而 base64 版本仅占用三分之四的空间。十六进制编码的 SHA-256 为 64 字节,而 base64 编码的 SHA-256 或多或少为 43 字节。
    • @zneak.kool 谢谢。要以不同的方式回答问题,亚马逊需要以 Base64 格式发送哈希,以便哈希在请求传输过程中不会出现乱码,为此它需要为可打印的文本格式。当然这是编码的定义:-)。
    【解决方案2】:

    例如,下面的字节、十六进制和 base64 样本编码相同的字节:

    • 字节:243 48 133 140 73 157 28 136 11 29 189 101 194 101 116 64 172 227 220 78
    • 十六进制:f330858c499d1c880b1dbd65c2657440ace3dc4e
    • base64:8zCFjEmdHIgLHb1lwmV0QKzj3E4=.

    只是 AWS 要求它的值是 base64 编码的。

    【讨论】:

    • 好的,但是使用 base64 代替十六进制有什么好处吗?我的意思是为什么亚马逊使用 base64 而不是 hex?
    • base64 用更少的 ASCII 字符编码相同的值。而且由于他们还在请求中使用通常使用 base64 编码的公钥签名,他们可能认为对所有值使用一种编码是有意义的。
    猜你喜欢
    • 2012-02-09
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多