在Access VBA中创建SHA1哈希和xml规范化

时间:2013-06-03 13:16:06

标签: vb.net vba ms-access

我是编程和使用Access 2010 VBA的新手。我需要将一组规则应用于xml文件,以便我可以访问API。我已经研究了不同的做法,但由于我的知识有限,我已经陷入困境。如果有人能指出我正确的道路/提供一些建议,这将是伟大的。

规则:

  1. 将xml文件规范化为W3C C14N规范。
  2. SHA1将xml哈希为二进制文件以进行进一步编码
  3. Base64和Base32编码SHA1哈希
  4. 我的第一个问题是我无法找到任何方法来在VBA中使用xml。所以我跳过这一步,因为我可以确保xml是预先规范化的。虽然理想情况下这将作为编码过程的一部分完成,以防有人更改先例xml。

    然后我开始查看SHA1哈希并找到此示例代码:

    http://vb.wikia.com/wiki/SHA-1.bas

    这里的问题是输出散列是十六进制的,我认为我需要在转换为base64之前将其转换为字节数组。我找不到任何示例代码来执行此操作。

    然后我发现了这篇文章: Base64 HMAC SHA1 String in VBA

    这是为HMACSHA1调用.net cyptography库,但是有一个SHA1库:

    http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha1.aspx

    这里的问题是我不知道如何调用.net库的工作。我需要在办公室的10台不同的Windows机器上运行这个软件,所以我需要了解它。

    最后我发现了我需要在vb.net中编写的确切功能:

    http://blog.kuffs.co.uk/2009/07/calculating-irmark-for-hmrc-gateway.html

    我再次没有.net的经验,也不确定如何将其构建到可访问的库中。

1 个答案:

答案 0 :(得分:1)

你走了:

Public Function SHA1Base64(ByVal sTextToHash As String)

    Dim asc As Object, enc As Object
    Dim TextToHash() As Byte
    Set asc = CreateObject("System.Text.UTF8Encoding")
    Set enc = CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider")
    TextToHash = asc.Getbytes_4(sTextToHash)
    Dim bytes() As Byte
    bytes = enc.ComputeHash_2((TextToHash))
    SHA1Base64 = EncodeBase64(bytes)
    Set asc = Nothing
    Set enc = Nothing

End Function

Private Function EncodeBase64(ByRef arrData() As Byte) As String

    Dim objXML As MSXML2.DOMDocument
    Dim objNode As MSXML2.IXMLDOMElement

    Set objXML = New MSXML2.DOMDocument

    ' byte array to base64
    Set objNode = objXML.createElement("b64")
    objNode.DataType = "bin.base64"
    objNode.nodeTypedValue = arrData
    EncodeBase64 = objNode.Text

    Set objNode = Nothing
    Set objXML = Nothing

End Function

请注意,几乎并非每个.NET Framework库都可用于VBA(无论如何都不要将它们包装在COM可调用包装器dll中)。恰好可以直接从VBA调用所需的功能。是的,确实没有太多关于此的文档我知道并且它不是直观的。 GetBytes_4和ComputerHash_2实际上是.NET中的“重载”函数,这在VBA中是不存在的。它基本上是你多次声明相同函数的地方,但每次它需要不同数量和/或不同类型的参数。

您可能希望将这些函数的输出与其他位置的某些已知良好输出进行比较。我之所以这么说只是因为我知道这段代码会返回一些东西,但我不知道这是不是你要找的东西。