2017-01-29 14 views
1

オブジェクト:https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/developing-an-alexa-skill-as-a-web-service?ref_=pe_679090_102923190#checking-the-signature-of-the-request復号化証明書の検証署名ハッシュ

  • がアサートされたハッシュ値を生成するために暗号化された署名を復号化する署名証明書から抽出された公開鍵を使用します。
  • フルHTTPSからSHA-1ハッシュ値を生成する(これは全体POSTまたは単に「リクエスト」JSONを意味かどうかわからない)導出されたハッシュ値を生成するために身体を要求

サンプルSIGNATURE:

FosqGd+Djx2PAXuER7msZwOsGok+BWZUXMj6LjEIDkhGp0yvmB/oB76C9Mu5fhL6ZH0AgZ862sZYArp2VZnANGy2fAzTyUa1dWL+uZuO4l9jAxq/7Y30W9+V1rStWF8LcYK48iaHdfsqPFm9otOWSLoIYhg9bo62rrCDBo9TeQOt8S63lrBTWc6csEQ0PRVsplkfnAb3edv46g0c7Mg4B3h+uQfq3+RveoKVrUDAEfg1SN7HLWtjxPcLJ1pxOYa29zu56aqiF/96G79gNyQMrUZ7wdnElWWA+lYgHNWAxCibKdzs7QiU1hgbLR+g45+33nHn+M2qgKjjGFcDtaMmPA==

署名証明書チェーンのURL:https://s3.amazonaws.com/echo.api/echo-api-cert-4.pem

サンプルポストJSON:

{"session":{"sessionId":"SessionId.d6d80552-79bf-445a-9e88-5f845a368718","application":{"applicationId":"amzn1.ask.skill.29dff22d-929c-4c74-bbe2-e2a9c83316c5"},"attributes":{},"user":{"userId":"amzn1.ask.account."},"new":true},"request":{"type":"IntentRequest","requestId":"EdwRequestId.c4a78877-5328-4009-9c1c-f6b8783186a2","locale":"en-US","timestamp":"2017-01-29T03:35:40Z","intent":{"name":"GetMovie","slots":{"Keyword":{"name":"Keyword"},"Genre":{"name":"Genre"}}}},"version":"1.0"} 

署名証明書から抽出した公開鍵を使用して、暗号化された署名を復号してアサートされたハッシュ値を生成する方法を完全に失っています。 .GetPublicKey()はかなり長いSystem.Byteを返しますが、今は何ですか?

現在のコード:

$cert = Get-PfxCertificate -FilePath $dlPath 
# 5.- Base64-decode the Signature header value on the request to obtain the encrypted signature 
$encryptedSignatureBytes = [System.Convert]::FromBase64String($Json.signature) 

# 6.- Use the public key extracted from the signing certificate to decrypt the encrypted signature to produce the asserted hash value  
$publicKey = $cert.GetPublicKey() #returns long System.Byte 
$assertedHash = $cert.PublicKey.Key.Decrypt($encryptedSignatureBytes, $false) #Exception calling "Decrypt" with "2" argument(s): "Key does not exist. 
$assertedHash = $cert.PublicKey.Key.DecryptValue($encryptedSignatureBytes) #Exception calling "DecryptValue" with "1" argument(s): "Method is not supported." 

# 7.- Generate a SHA-1 hash value from the full HTTPS request body to produce the derived hash value  
$requestBodySHA1 = $(Get-StringHash $Json.requestBody) 

# 8.- Compare the asserted hash value and derived hash values to ensure that they match  
if ($assertedHash -eq $requestBodySHA1) 
{ 
    #todo 
} 

答えて

0

これは私が実際の要件を理解したら、予想以上に簡単になってしまいました。署名とAmazonのポストリクエストを比較するために、私がしなければならなかったのは、Byte []としてリクエストを取得し、Base64変換からSignatureがすでにByte []でしたし、$ cert.PublicKey.Key.VerifyData関数にフィードします 署名または要求のいずれかのバイトを変更した場合、それは失敗します。

# 7.- Generate a SHA-1 hash value from the full HTTPS request body to produce the derived hash value 
$requestBodyBytes = [System.IO.File]::ReadAllBytes($req) 
# 8.- Compare the asserted hash value and derived hash values to ensure that they match 
$sha1Oid = [System.Security.Cryptography.CryptoConfig]::MapNameToOID('SHA1') 
if(!($cert.PublicKey.Key.VerifyData($requestBodyBytes, $sha1Oid, $encryptedSignatureBytes))) 
{ 
    $validErr += "`nFailed request hash comparison to signature." 
} 
関連する問題