没有回答的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, ...而不是它代表的大数字。
答案 0 :(得分:2)
您的签名是一个20字节(160位)长字节数组。 所以它基本上是一个很长的数字。
当你显示它时,你将它转换成一个十六进制字符串,所以每个字节显示为2个字符,所以你得到一个40个字符长的字符串。
Base64编码为每3字节的有效负载提供4个字符进行编码。
如果使用base64 20字节的二进制数据进行编码,则得到26.6字节,向上舍入为28(每4字节向上舍入)。 如果您对40个字符长的字符串(320位)进行编码,则会获得53,3个字符,再次向上舍入为56。
我想你正在做后者,并编码一个字符串而不是一个byte []。
答案 1 :(得分:0)
我在这里遇到了同样的问题。您必须将sha1sum结果转换为十六进制格式。例如,当你的sha1sum结果是“dfe5ec35f9c9f144d3814821a558bcfa23ab1a58”时,控制台以字符串格式输出它。您可以使用UltraEdit或其他文本编辑器,将其编辑为十六进制。 enter image description here
然后将其另存为文件。 在对文件进行base64编码后,会出现正确答案“3 + XsNfnJ8UTTgUghpVi8 + iOrGlg =”。
试一试。希望它有所帮助。