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

Vb.net 在Access VBA中创建SHA1哈希和xml规范化,vb.net,vba,ms-access,Vb.net,Vba,Ms Access,我是编程和使用Access 2010 VBA的新手。我需要对xml文件应用一组规则,以便访问API。我曾尝试过不同的方法,但由于我的知识有限,每种方法都被卡住了。如果有人能为我指出正确的道路/提供一些建议,那就太好了 规则: 将xml文件规范化为W3C C14N规范 SHA1将xml散列为二进制,以便进一步编码 Base64和Base32对SHA1哈希进行编码 我的第一个问题是,我找不到任何方法在VBA中对xml进行c14n。因此,我跳过了这一步,因为我可以确保xml是预先规范化的。虽然理想情况

我是编程和使用Access 2010 VBA的新手。我需要对xml文件应用一组规则,以便访问API。我曾尝试过不同的方法,但由于我的知识有限,每种方法都被卡住了。如果有人能为我指出正确的道路/提供一些建议,那就太好了

规则:

  • 将xml文件规范化为W3C C14N规范
  • SHA1将xml散列为二进制,以便进一步编码
  • Base64和Base32对SHA1哈希进行编码
  • 我的第一个问题是,我找不到任何方法在VBA中对xml进行c14n。因此,我跳过了这一步,因为我可以确保xml是预先规范化的。虽然理想情况下,这将作为编码过程的一部分来完成,以防有人更改先前的xml

    然后我开始查看SHA1散列,并发现以下示例代码:

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

    然后我看到了这个帖子:

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

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

    最后,我找到了我需要在vb.net中编写的确切函数:

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

    给你:

    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中是不存在的。基本上就是多次声明同一个函数,但每次都使用不同数量和/或不同类型的参数

    您可能希望将这些函数的输出与其他地方的已知良好输出进行比较。我这么说只是因为我知道这段代码返回了一些东西,但我不知道这是否就是你要找的