为什么我的Base64编码哈希值只有28个字符?

3

这里存在一个没有答案的反问句,以及一个我不理解的评论。

我正在尝试为API创建一个伪OAuth认证头部的Base64编码HMAC-SHA1签名。我找到了一份支持文档(需要经过身份验证的访问),其中介绍了如何逐步创建签名。我能够创建相同的数据,直到最后一步,即对哈希进行Base64编码。

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

cb5acd2d3ef689a8fbec4d06c576371834689673

我得到:

CB5ACD2D3EF689A8FBEC4D06C576371834689673

支持文档随后说明:

从第三步的十六进制结果字符串中,使用Base64编码该值

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

Y2I1YWNkMmQzZWY2ODlhOGZiZWM0ZDA2YzU3NjM3MTgzNDY4OTY3Mw==

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

我被难住了,我不知道支持文档是错误的还是我做错了什么。我生成的字符串是28个字符,而示例是56个字符,这太有趣了,不能忽略。 前面提到的半重复问题 中的评论也使我困惑。我不明白字符串"MDY"如何转换为对我有意义的任何ascii或unicode数字 - 我不理解评论作者是如何得出这个结论的。

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


1
较长的base64字符串是字符串“cb5acd2...”的base64编码,而较短的则是字节数组“new byte[] {0xcb, 0x5a, 0xcd...}”的base64编码。 - Joachim Isaksson
3个回答

4

您的签名是一个20字节(160位)的字节数组。因此,它基本上是一个非常长的数字。

当您展示它时,您将其转换为十六进制字符串,因此每个字节都显示为2个字符,因此您会得到一个40个字符长的字符串。

Base64编码为每3个有效载荷字节编码4个字符。

如果您对20个字节的二进制数据进行Base64编码,则会获得26.6个字节,四舍五入为28(每4个字节向上取整)。 如果您对40个字符长的字符串(320位)进行编码,则会获得53.3个字符,再次四舍五入为56。

我想您正在执行后者,并对字符串进行编码,而不是byte[]。


2

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

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

enter image description here

然后将其保存为文件。在对文件进行base64编码之后,正确答案是3+XsNfnJ8UTTgUghpVi8+iOrGlg=

试一试。希望能帮到您。


1
没错,但当时我没有足够的声望来评论A Chiesa先生的答案~~ - 王晓静

-2

答案是正确的,这里有一个小的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=='

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接