#author("2018-08-05T15:16:24+09:00","","")
#navi(../)
* PowerShellでHMAC-SHA256, HMAC-SHA512を使用する方法 [#w18a33ef]
PowerShellでHMAC-SHA256, HMAC-SHA512を使用するサンプルを以下に記します。~
例えば、仮想通貨取引所 ZaifのプライベートAPIなどの署名に使用されています。~
#contents
#htmlinsert(win_ads_top.html)
* 関連資料 [#da18b0c9]
-PowerShellで仮想通貨取引所のAPIにアクセスするサンプルを公開しています。~
[[仮想通貨取引所のAPIを使ってみる>http://cryptocurrency.just4fun.biz/?API]]
* HMAC-SHAの使用例の説明 [#ab6e5e8b]
以下の例は、HMAC-SHA512のサンプルになります。~
下記の例では、HMAC-SHA512のオブジェクトを作成しています。~
$oHMACSHA512 = New-Object System.Security.Cryptography.HMACSHA512
HMAC-SHA256を使用したい場合は、以下のように512を256に変更するだけで対応できます。
$oHMACSHA256 = New-Object System.Security.Cryptography.HMACSHA256
以下、HMAC-SHA512で署名したサンプルとなります。
+ 署名用のシークレットキーを設定します。(サンプルなのえ値は適当です。)
$SECRET_KEY = "456"
+ New-Objectコマンドレットを使い、HMAC-SHA512オブジェクトを作成します。
$oHMACSHA512 = New-Object System.Security.Cryptography.HMACSHA512
+ 作成したHMAC-SHA512オブジェクトにシークレットキーを設定します。
$oHMACSHA512.key = [Text.Encoding]::ASCII.GetBytes($SECRET_KEY)
+ ハッシュかするメッセージを設定します。(サンプルなので値は適当です。)
$MESSAGE = "789"
+ 署名されたデータを取得します。
$signature_rawout = $oHMACSHA512.ComputeHash([Text.Encoding]::ASCII.GetBytes($MESSAGE))
上記で取得した情報はByte値の配列となります。
+ 仮想通貨取引所 Zaif では、上記で取得した情報を16進を文字列で渡すように指定されています。~
このような場合は、以下の構文で取得したByte[]を16進値の文字列で表示することができます。
$signature = ""
$signature_rawout | % { $i = [Convert]::ToString($_,16); if ($i.length -eq 1) { $i ='0' + $i }; $signature += $i }
+16進値の文字列が格納されています。
$signature
dc247cecbb2100248bb44f5c935c694e502accf1d397b51f238c18bfe823bd6c5bd948eec004eac42e19ea9dd3f1751006edd60a3437c282785170b235db6ecc
+ BASE64にしたい場合は以下のようにすればよいでしょう。
$signatureB64 = [Convert]::ToBase64String($signature_rawout)
$signatureB64
3CR87LshACSLtE9ck1xpTlAqzPHTl7UfI4wYv+gjvWxb2UjuwATqxC4Z6p3T8XUQBu3WCjQ3woJ4UXCyNdtuzA==
* HMAC-SHA512使用時の出力例 [#b05ca1de]
上記の例を実際にPowerShellコンソール上で動かしてみた出力です。
PS C:\> $SECRET_KEY = "456"
PS C:\> $oHMACSHA512 = New-Object System.Security.Cryptography.HMACSHA512
PS C:\> $oHMACSHA512.key = [Text.Encoding]::ASCII.GetBytes($SECRET_KEY)
PS C:\> $MESSAGE = "789"
PS C:\> $signature_rawout = $oHMACSHA512.ComputeHash([Text.Encoding]::ASCII.GetBytes($MESSAGE))
PS C:\> $signature = ""
PS C:\> $signature_rawout | % { $i = [Convert]::ToString($_,16); if ($i.length -eq 1) { $i ='0' + $i }; $signature += $i }
PS C:\> $signature
dc247cecbb2100248bb44f5c935c694e502accf1d397b51f238c18bfe823bd6c5bd948eec004eac42e19ea9dd3f1751006edd60a3437c282785170b235db6ecc
PS C:\> $signatureB64 = [Convert]::ToBase64String($signature_rawout)
PS C:\> $signatureB64
3CR87LshACSLtE9ck1xpTlAqzPHTl7UfI4wYv+gjvWxb2UjuwATqxC4Z6p3T8XUQBu3WCjQ3woJ4UXCyNdtuzA==
PS C:\>
以上、PowerShellでHMAC-SHAを使用する方法でした。
//#htmlinsert(win_ads_btm.html)