【问题标题】:Encoding newline in VB.NET for HMAC SHA1在 VB.NET 中为 HMAC SHA1 编码换行符
【发布时间】:2017-06-09 00:01:00
【问题描述】:

我在使用 OAuth 验证 API 时遇到问题。我可以让它在 Python 中正常工作,但在 VB.Net 中不行。我意识到问题是 SHA1 算法在 Python 和 VB.NET 中为我认为相同的消息返回了不同的值。只有当消息中有换行符“\n”时才会出现这种情况(API 调用必须有)。使用Environment.NewLine 似乎没有帮助。

我正在使用的代码(基于this answer)在这里,其中包含我从 Python 程序中获得的预期值:

Public Sub Main()           
    ' Expect D/5B78PD9pFhmqZQi3eenPBy6ks=
    ' Get    D/5B78PD9pFhmqZQi3eenPBy6ks=
    console.writeline(getHash("a", "msg"))

    ' Expect yuuq6RwtwkoJ6n3PquGFx60MLas=
    ' Get    uv4AwQjvYeCTajhHw7EFtPlJfCE=
    console.writeline(getHash("a", "msg\n"))

    ' Expect yuuq6RwtwkoJ6n3PquGFx60MLas=       
    ' Get efRfAnmIN/C/YX/UPHVPFY5VjJg=
    console.writeline(getHash("a", "msg" + Environment.NewLine))

End Sub

Public Function getHash(ByVal key As String, ByVal msg As String) As String
    Dim myEncoder As New System.Text.UTF8Encoding
    Dim keyBytes() As Byte = myEncoder.GetBytes(key)
    Dim msgBytes() As Byte = myEncoder.GetBytes(msg)

    Dim myHMACSHA1 As New System.Security.Cryptography.HMACSHA1(keyBytes)
    Dim HashCode As Byte() = myHMACSHA1.ComputeHash(msgBytes)

    Return Convert.ToBase64String(HashCode)
End Function

如果有用的话,我的 Python 程序是:

import base64
import hashlib
import hmac

key = "a"
msg = "msg\n"
key_byte = key.encode('utf-8')
msg_byte = msg.encode('utf-8')

h = hmac.new(key_byte, msg_byte, hashlib.sha1)
print base64.b64encode(h.digest())   # yuuq6RwtwkoJ6n3PquGFx60MLas=

我的猜测是这与换行符的编码方式有关,但我不知道如何解决。

【问题讨论】:

    标签: vb.net oauth newline hmac


    【解决方案1】:

    首先我想指出,VB.NET 中的\n 不代表换行符。它实际上会变成\n

    Environment.NewLine 适应当前操作系统。不同的操作系统使用不同的行尾。这里的问题是 Python 代码使用 Line Feed 字符 (\n) 作为新行指示符,但由于 Environment.NewLine 适应操作系统,它将返回 Windows 的行尾,即 Carriage Return + 换行 (\r\n)。

    因此,如果您希望它与 Python 代码匹配,您必须确保插入换行符。例如:

    Console.WriteLine(getHash("a", "msg" & vbLf))
    

    【讨论】:

    • 是的,这就是我一直在尝试的。我尝试使用 vbLf Chr(10) 但它说它们没有被声明。我不知道他们隐藏在哪个模块中。
    • @PeterCollingridge :它们位于Microsoft.VisualBasic 命名空间中的某个位置。确保您的项目引用Microsoft.VisualBasic.dll
    • 我目前正在在线解释器 (dotnetfiddle.net) 上进行测试。也许由于某种原因它们在那里不可用。我可以在 Visual Studio 中尝试。
    • 啊,我明白了,我需要Imports Microsoft.VisualBasic。谢谢!
    • @PeterCollingridge :那是因为您必须在 dotnetfiddle 上导入 Microsoft.VisualBasic 命名空间。它在 Visual Studio 中自动导入。试试看:dotnetfiddle.net/VAzv7h -- 编辑: 哦,你打败了我。很高兴我能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 2017-12-29
    • 2011-01-28
    • 1970-01-01
    • 2011-10-26
    相关资源
    最近更新 更多