#author("2018-08-05T15:16:24+09:00","","") #navi(../) * PowerShellでHMAC-SHA256, HMAC-SHA512を使用する方法 [#w18a33ef] PowerShellでHMAC-SHA256, HMAC-SHA512を使用するサンプルを以下に記します。~ 例えば、仮想通貨取引所の&htmlinsert(zaif_link.html);のプライベートAPIなどの署名に使用されています。~ #contents #htmlinsertpcsp(win-top.html,win-sp.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値の配列となります。 + 仮想通貨取引所 &htmlinsert(zaif.html); では、上記で取得した情報を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を使用する方法でした。 #htmlinsertpcsp(win-btm.html,win-sp.html)