2012-06-11 121 views
2

另一個關於VBA的新手問題系列。我可以在VBA中使用DPAPI(或類似的東西)嗎?

我正在編寫VBA中的Excel加載項,並且加載項使用本地配置文件。
該文件需要包含遠程服務的密碼。
顯然,將密碼存儲爲明文是不太理想的。但是我正在尋找一種可以對文本進行編碼/解碼的算法,因此它至少不會像配置文件中的明文那樣看起來像一樣

我遇到了對Windows DPAPI的引用,但我不確定這是否是適用於Excel VBA的解決方案。我也不確定如何在VBA中使用這個API,因爲我只找到了在.NET中使用它的參考。 Visual Studio對此項目不可用。

所以這個由兩部分組成的問題是這樣的:
1)如果可以從VBA中使用DPAPI,我可以使用它的一個例子嗎?
2)如果無法在VBA中使用DPAPI,對於如何以可逆編碼方式存儲文本,您有任何建議嗎?

如果問題很重要,該解決方案必須在Excel 2003及更高版本中運行。

再次感謝您。

+1

如何「安全」並您的解決方案需要是什麼?也就是說,你需要能夠抵制什麼水平來設法找出密碼?請記住,無論您如何操作,它只會像VBA項目上的密碼保護一樣安全,因爲一旦被繞過,您的解碼服務密碼便於訪問...... –

+0

最終,對於此項目, 「真正需要比」平均喬在記事本中打開配置文件時沒有看到密碼「更安全。如果「攻擊者」複製用戶的配置文件,那麼無論它是多麼安全都無所謂。能夠使用DPAPI會很好,但如果有更簡單的可能性,我可以使用更簡單的方法。 – Josh

+0

..但我希望它比rot13或簡單的替換密碼稍微複雜:) – Josh

回答

1

解決方案必須在Excel 2003及更高版本中工作,如果它很重要的話。

對於Excel VBA,我建議使用CAPICOM庫。

here下載文件。安裝完成後,請按照以下說明註冊Dll。

32位操作系統

複製文件的CAPICOM.dll從C:\Program Files\Microsoft CAPICOM 2.1.0.2 SDK\LibC:\Windows\System32

下一頁上開始菜單 | 運行,輸入此

Regsvr32 C:\Windows\System32\Capicom.dll 

64位操作系統

將文件複製CAPICOM。dll從C:\Program Files (x86)\Microsoft CAPICOM 2.1.0.2 SDK\Lib\X86C:\Windows\SysWOW64

Next on 開始菜單 | 運行,鍵入此

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

相關問題