2017年10月19日木曜日

WindowsのExcel VBAから.NET Frameworkの暗号サービスを呼び出す方法

WindowsのExcel VBAから.NET FrameworkのSystem.Security.Cryptography名前空間に属するクラスのプロパティ、メソッドを呼び指す方法をご紹介します。 これにより、WindowsのExcel VBAからHMAC-SHA1、HMAC-SHA256などの処理が簡単に出来るようになります。

Windowsに.NET Framework 3.5をインストールする

WindowsのExcel VBAから呼び出せる.NET Frameworkはバージョン3.5までのようですので、Windows 10の場合、[Windowsの機能の有効化または無効化]を呼び出して.NET Framework 3.5をインストールする必要があります。

[Windowsスタートボタン]-[Windowsの設定]-[アプリ]-[プログラムと機能]-[Windowsの機能の有効化または無効化]

上の画面で「.NET Framework 3.5(.NET 2.0 および 3.0 を含む)」のチェックボックスを■の状態(上記画面の状態)にします。

これで、WindowsのExcel VBAから.NET Framework 3.5の暗号サービスを呼び出せるようになります。

Excel VBAのプログラム

実際に使用する例としてTwitter APIとAmazon Product Advertising APIのHTTPリクエストで使用する署名作成プログラムをご紹介します。

ご紹介する例では、Excel VBAのCreateObject関数を使って.NET FrameworkのSystem.Security.Cryptography名前空間のクラスのオブジェクトを生成しています。

Twitter APIの署名作成プログラム

Twitter APIの署名作成プログラムは下記のとおりです。

  1. ' 署名の元となる文字列。使用している値についてはTwitter APIの下記文書を参照。
  2. ' https://developer.twitter.com/en/docs/basics/authentication/guides/creating-a-signature
  3. ' Developer - Documentation - Basics - Authentication - Guides - Creating a signature 参照
  4. Dim strSourceOfSignature As String
  5. strSourceOfSignature = "POST" _
  6. & "&https%3A%2F%2Fapi.twitter.com%2F1.1%2Fstatuses%2Fupdate.json&include_entities%3Dtrue" _
  7. & "%26oauth_consumer_key%3Dxvz1evFS4wEEPTGEFPHBog" _
  8. & "%26oauth_nonce%3DkYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg" _
  9. & "%26oauth_signature_method%3DHMAC-SHA1" _
  10. & "%26oauth_timestamp%3D1318622958" _
  11. & "%26oauth_token%3D370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb" _
  12. & "%26oauth_version%3D1.0" _
  13. & "%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521"
  14. ' HMAC-SHA1を使って署名を算出。
  15. Dim objHMACSHA1 As Object
  16. Set objHMACSHA1 = CreateObject("System.Security.Cryptography.HMACSHA1")
  17. Dim byteKeys() As Byte
  18. ' Signing key: kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE
  19. byteKeys = StrConv("kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE", vbFromUnicode)
  20. objHMACSHA1.Key = byteKeys
  21. Dim byteTexts() As Byte
  22. byteTexts = StrConv(strSourceOfSignature, vbFromUnicode)
  23. Dim byteHMACSHA1s() As Byte
  24. byteHMACSHA1s = objHMACSHA1.ComputeHash_2(byteTexts)
  25. ' 算出した署名をBase64エンコードする。
  26. Dim objDOMDocument As Object
  27. Set objDOMDocument = CreateObject("MSXML2.DOMDocument")
  28. Dim objIXMLDOMElement As Object
  29. Set objIXMLDOMElement = objDOMDocument.createElement("b64")
  30. objIXMLDOMElement.DataType = "bin.base64"
  31. objIXMLDOMElement.nodeTypedValue = byteHMACSHA1s
  32. Dim strSignature As String
  33. strSignature = objIXMLDOMElement.Text
  34. MsgBox strSignature
  35. Set objHMACSHA1 = Nothing
  36. Set objDOMDocument = Nothing
  37. Set objIXMLDOMElement = Nothing
Amazon Product Advertising APIの署名作成プログラム

Amazon Product Advertising APIの署名作成プログラムは下記のとおりです。

  1. ' 署名の元となる文字列。使用している値についてはAmazon Product Advertising APIの下記文書を参照。
  2. ' Amazon Product Advertising API Developer Guide (API Version 2013-08-01)
  3. ' http://docs.aws.amazon.com/ja_jp/AWSECommerceService/latest/DG/rest-signature.html
  4. ' Programming Guide - Requests - Request Authentication - Authenticating REST Requests - Example REST Requests 参照
  5. Dim strSourceOfSignature As String
  6. strSourceOfSignature = "GET" & Chr(10) & "webservices.amazon.com" & Chr(10) & "/onca/xml" & Chr(10) _
  7. & "AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE" _
  8. & "&AssociateTag=mytag-20" _
  9. & "&ItemId=0679722769" _
  10. & "&Operation=ItemLookup" _
  11. & "&ResponseGroup=Images%2CItemAttributes%2COffers%2CReviews" _
  12. & "&Service=AWSECommerceService" _
  13. & "&Timestamp=2014-08-18T12%3A00%3A00Z" _
  14. & "&Version=2013-08-01"
  15. ' HMAC-SHA256を使って署名を算出。
  16. Dim objHMACSHA256 As Object
  17. Set objHMACSHA256 = CreateObject("System.Security.Cryptography.HMACSHA256")
  18. Dim byteKeys() As Byte
  19. ' AWS secret key: 1234567890
  20. byteKeys = StrConv("1234567890", vbFromUnicode)
  21. objHMACSHA256.Key = byteKeys
  22. Dim byteTexts() As Byte
  23. byteTexts = StrConv(strSourceOfSignature, vbFromUnicode)
  24. Dim byteHMACSHA256s() As Byte
  25. byteHMACSHA256s = objHMACSHA256.ComputeHash_2(byteTexts)
  26. ' 算出した署名をBase64エンコードする。
  27. Dim objDOMDocument As Object
  28. Set objDOMDocument = CreateObject("MSXML2.DOMDocument")
  29. Dim objIXMLDOMElement As Object
  30. Set objIXMLDOMElement = objDOMDocument.createElement("b64")
  31. objIXMLDOMElement.DataType = "bin.base64"
  32. objIXMLDOMElement.nodeTypedValue = byteHMACSHA256s
  33. Dim strSignature As String
  34. strSignature = objIXMLDOMElement.Text
  35. MsgBox strSignature
  36. Set objHMACSHA256 = Nothing
  37. Set objDOMDocument = Nothing
  38. Set objIXMLDOMElement = Nothing

Excel VBAから呼び出せる.NET Frameworkの制限事項

Excel VBAからすべての.NET Frameworkのクラスを呼び出せるわけではありません。 呼び出せる.NET Frameworkのクラスには制限があります。 制限は下記のとおりです。

  1. Excel VBAから使用できる.NET Frameworkのバージョンは3.5まで
  2. クラスに引数を取らないコンストラクター(既定のコンストラクター)が必要
  3. クラスのPrivate、Protected、Static(Shared)なプロパティ、メソッドは呼び出せない
  4. オーバーロードされているメソッドは「メソッド名_1」「メソッド名_2」のように、メソッド名にアンダーバー「_」と数字を付け加えて呼び出す

上記の制限事項については下記のサイトに詳しく説明が載っています。
Microsoft Office と .NET の相互運用性
.NETFrameworkの使用

記事終わり

0 件のコメント:

コメントを投稿