【问题标题】:Why does my Base64 encoded hash only contain 28 characters?为什么我的 Base64 编码哈希只包含 28 个字符?
【发布时间】:2016-07-01 19:57:42
【问题描述】:

inverse question exists 没有回答和我不明白的评论。

我正在尝试为 API 的伪 OAuth 身份验证标头创建 Base64 编码的 HMAC-SHA1 签名。我找到了一份支持文档(需要经过身份验证的访问权限),它会带您了解创建签名的整个过程。在对哈希进行 Base64 编码的最后一步之前,我能够创建相同的数据。

支持文档指出 HMAC-SHA1 签名是:

cb5acd2d3ef689a8fbec4d06c576371834689673

我得到:

CB5ACD2D3EF689A8FBEC4D06C576371834689673

支持文件然后声明

从步骤 3 中的十六进制结果字符串,使用 Base64 对值进行编码

并提供以下 Base64 编码结果(58 个字符):

Y2I1YWNkMmQzZWY2ODlhOGZiZWM0ZDA2YzU3NjM3MTgzNDY4OTY3Mw==

当我使用Convert.ToBase64String() 转换我的签名时,我得到(28 个字符):

y1rNLT72iaj77E0GxXY3GDRolnM=

我很困惑,我不知道支持文档是否不正确,或者我做错了什么。我正在生成一个 28 个字符的字符串,而示例是 56 个字符,这一事实太有趣了,不容忽视。

aforementioned semi-duplicate question 中的评论也难倒我。我看不到字符串“MDY”如何转换为对我有意义的任何 ascii 或 unicode 数字 - 我不明白评论作者是如何得出这个结论的。

十六进制值被编码为文本 ("062..." == 0x30, 0x36, 0x32, ...) 而不是它所代表的大量数字。

【问题讨论】:

  • 较长的base64字符串是字符串"cb5acd2...的base64编码,较短的是字节数组new byte[] {0xcb, 0x5a, 0xcd...的base64编码。

标签: c# base64 encode sha


【解决方案1】:

您的签名是一个 20 字节(160 位)长字节数组。 所以它基本上是一个很长的数字。

当你显示它时,你将它转换成一个十六进制字符串,所以每个字节显示为 2 个字符,所以你得到一个 40 个字符长的字符串。

Base64 编码为每 3 个有效负载字节提供 4 个字符进行编码。

如果你用 base64 编码 20 字节的二进制数据,你会得到 26.6 字节,四舍五入到 28(你每 4 个字节四舍五入)。 如果对 40 个字符的长字符串(320 位)进行编码,则会得到 53,3 个字符,再次四舍五入为 56。

我想你正在做后者,并且编码一个字符串而不是一个字节[]。

【讨论】:

    【解决方案2】:

    我在这里遇到了同样的问题。您必须将 sha1sum 结果转换为十六进制格式。例如当你的sha1sum结果为dfe5ec35f9c9f144d3814821a558bcfa23ab1a58时,控制台以字符串格式输出。

    您可以使用 UltraEdit 或其他文本编辑器,将其编辑为十六进制。

    然后将其保存为文件。 正确的答案3+XsNfnJ8UTTgUghpVi8+iOrGlg= 在你对文件进行base64编码后出来。

    试一试。希望对您有所帮助。

    【讨论】:

    • 没错,但当时我没有足够的声望来评论 A Chiesa 先生的回答~~
    【解决方案3】:

    The answer是正确的,这里是一个python小例子

    import base64
    import hashlib
    
    # replace "hello" with your value from which you get sha1    
    sha = hashlib.sha1(b'hello') 
    sha_bytes = sha.digest()  # 20 bytes
    sha_str = sha.hexdigest()  # 40 bytes - you are trying to b64encode this value
    
    b64_sha_bytes = base64.b64encode(sha_bytes)  # b'qvTGHdzF6KLavt4PO0gs2a6pQ00='
    b64_sha_str = base64.b64encode(sha_str.encode())  # b'YWFmNGM2MWRkY2M1ZThhMmRhYmVkZTBmM2I0ODJjZDlhZWE5NDM0ZA=='
    

    【讨论】:

      猜你喜欢
      • 2013-12-03
      • 1970-01-01
      • 2017-06-07
      • 2020-10-16
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      相关资源
      最近更新 更多