我可以在VBA中使用DPAPI(或类似的东西)吗?

时间:2012-06-11 16:45:52

标签: excel-vba dpapi vba excel

另一篇关于VBA的初学问卷系列。

我正在使用VBA编写Excel加载项,加载项使用本地配置文件。
此文件需要包含远程服务的密码 显然,将此密码存储为纯文本并不理想。但我正在寻找一种可以编码/解码文本的算法,因此它至少不会像配置文件中的明文那样看起来像

我遇到了对Windows DPAPI 的引用,但我不确定这是否是Excel VBA的合适解决方案。我也不确定如何在VBA中使用此API,因为我只找到了将它与.NET一起使用的参考。 Visual Studio不适用于此项目。

因此,由两部分组成的问题是:
1)如果可以在VBA中使用DPAPI,我可以举一个使用它的例子吗? 2)如果无法在VBA中使用DPAPI,您对如何以某种可逆的编码方式存储文本有任何建议吗?

如果重要,解决方案必须在Excel 2003及更高版本中运行。

再次感谢你。

1 个答案:

答案 0 :(得分:1)

  

如果重要,解决方案必须在Excel 2003及更高版本中运行。

对于Excel VBA,我建议使用CAPICOM库。

here下载文件。安装完成后,请按照以下说明注册Dll。

32位操作系统

将文件Capicom.dll从C:\Program Files\Microsoft CAPICOM 2.1.0.2 SDK\Lib复制到C:\Windows\System32

开始菜单 |下一步运行,输入此

Regsvr32 C:\Windows\System32\Capicom.dll

64位操作系统

将文件Capicom.dll从C:\Program Files (x86)\Microsoft CAPICOM 2.1.0.2 SDK\Lib\X86复制到C:\Windows\SysWOW64

开始菜单 |下一步运行,输入此

Regsvr32 C:\Windows\SysWOW64\Capicom.dll

现在我们将在VBA项目中使用它

将此代码粘贴到模块中

Option Explicit

Sub Sample()
    Dim TextToEncrypt As String, EncryptedText As String
    Dim TextToDeCrypt As String, DeCryptedText As String
    Dim KeyToEncrypt As String

    TextToEncrypt = "Hello World"
    KeyToEncrypt = "JoshMagicWord"

    EncryptedText = EncryptString(TextToEncrypt, KeyToEncrypt)
    DeCryptedText = DecryptString(EncryptedText, KeyToEncrypt)

    Debug.Print "The string " & TextToEncrypt & " after encryption looks like this"
    Debug.Print "-----------------------------------------------------------------"
    Debug.Print EncryptedText
    Debug.Print "-----------------------------------------------------------------"
    Debug.Print "The above string after decrypting looks like this"
    Debug.Print "-----------------------------------------------------------------"
    Debug.Print DeCryptedText

End Sub

Public Function EncryptString(strText As String, ky As String) As String
    Dim Cap As Object
    Dim cryptIt

    Set Cap = CreateObject("CAPICOM.EncryptedData")

    Cap.Algorithm = 3
    Cap.SetSecret ky
    Cap.Content = strText
    EncryptString = Cap.Encrypt
End Function

Public Function DecryptString(strText As String, ky As String) As String
    Dim Cap As Object
    Dim cryptIt

    Set Cap = CreateObject("CAPICOM.EncryptedData")

    Cap.Algorithm = 3
    Cap.SetSecret ky
    Cap.Decrypt strText

    DecryptString = Cap.Content
End Function

函数EncryptString加密字符串,函数DecryptString解密字符串。运行上述Sub Sample

时,请查看结果快照

enter image description here