不能在VBA上使用.GetBytes和.ComputeHash方法

时间:2016-04-03 11:15:56

标签: vb.net vba hash encoding

我想将VB函数转换为VBA。该函数正在使用"System.Text.UTF8Encoding""System.Security.Cryptography.HMACSHA256"

对象及其".GetBytes"".ComputeHash"方法。

我已经添加了#34; System"和" mscorlib.dll"参考VBA代码,但我接收到"无效的程序调用或参数"错误。

这是我的VB功能:

Function HashString(ByVal StringToHash As String, ByVal HachKey As String) As String
    Dim myEncoder As New System.Text.UTF8Encoding
    Dim Key() As Byte = myEncoder.GetBytes(HachKey)
    Dim Text() As Byte = myEncoder.GetBytes(StringToHash)
    Dim myHMACSHA256 As New System.Security.Cryptography.HMACSHA256(Key)
    Dim HashCode As Byte() = myHMACSHA256.ComputeHash(Text)
    Dim hash As String = Replace(BitConverter.ToString(HashCode), "-", "")
    Return hash.ToLower
End Function

这就是我已经翻译成VBA的内容:

Function HashString(ByRef StringToHash As String, ByRef HachKey As String) As String
    Dim myEncoder As Object
    Dim myHMACSHA256 As Object
    Dim Key As Byte
    Dim Text As Byte
    Dim HashCode As Byte
    Dim hash As String
    Set myEncoder = CreateObject("System.Text.UTF8Encoding")
    Set myHMACSHA256 = CreateObject("System.Security.Cryptography.HMACSHA256")
    Key = myEncoder.GetBytes(HachKey)
    Text = myEncoder.GetBytes(StringToHash)
    HashCode = myHMACSHA256.ComputeHash(Text)
    hash = Replace(BitConverter.ToString(HashCode), "-", "")
    HashString = hash.ToLower
End Function

有人可以帮忙吗?我的第一个猜测是我正在使用" .GetBytes"和" .ComputeHash"方法不正确

提前致谢

2 个答案:

答案 0 :(得分:2)

使用VBA计算HMACSHA256的工作示例:

Function ComputeHMACSHA256(key As String, text As String) As String
  Dim encoder As Object, crypto As Object
  Dim hash() As Byte, hmacsha As String, i As Long

  ' compute HMACSHA256
  Set encoder = CreateObject("System.Text.UTF8Encoding")
  Set crypto = CreateObject("System.Security.Cryptography.HMACSHA256")
  crypto.key = encoder.GetBytes_4(key)
  hash = crypto.ComputeHash_2(encoder.GetBytes_4(text))

  ' convert to an hexa string
  hmacsha = String(64, "0")
  For i = 0 To 31
     Mid$(hmacsha, i + i + (hash(i) > 15) + 2) = Hex(hash(i))
  Next

  ComputeHMACSHA256 = LCase(hmacsha)
End Function


Sub UsageExample()
  Debug.Print ComputeHMACSHA256("abcdef", "12345")
End Sub

答案 1 :(得分:1)

当通过COM使用以支持重载.Net功能具有基于Name_n的实现。由于GetBytes已重载,您需要GetBytes_4(),这是接受字符串的重载和_2的{​​{1}}

ComputeHash()
Function HashString(ByRef StringToHash As String, ByRef HachKey As String) As String
    Dim myEncoder As Object
    Dim myHMACSHA256 As Object
    Dim Key() As Byte '// all need to be arrays
    Dim Text() As Byte
    Dim HashCode() As Byte
    Dim hash As String
    Set myEncoder = CreateObject("System.Text.UTF8Encoding")
    Set myHMACSHA256 = CreateObject("System.Security.Cryptography.HMACSHA256")
    Key = myEncoder.GetBytes_4(HachKey)
    Text = myEncoder.GetBytes_4(StringToHash)
    HashCode = myHMACSHA256.ComputeHash_2(Text)

    Dim i As Long
    For i = 0 To UBound(HashCode)
        Debug.Print Format$(Hex(HashCode(i)), "00")
    Next
End Function