2017-10-27 11 views
1

私は、V4 HMAC署名を生成する方法についてAWSの例を追ってきました。私はこれをJavaで成功させましたが、Node/JavaScriptで動作させようとしています。私のコードを使用すると、下の1番目の例で正しい中間鍵が生成されますが、次の例では、StringToSignという正しい中間鍵を生成した同じコードが仮定された正しい署名を生成できません。AWS Signature Version 4 S3 Node.jsを使用してアップロード

正しい仲介キー:

secretkey = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY' 
dateStamp = '20120215' 
regionName = 'us-east-1' 
serviceName = 'iam' 

kSecret = '41575334774a616c725855746e46454d492f4b374d44454e472b62507852666943594558414d504c454b4559' 
kDate = '969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d' 
kRegion = '69daa0209cd9c5ff5c8ced464a696fd4252e981430b10e3d3fd8e2f197d7a70c' 
kService = 'f72cfd46f26bc4643f06a11eabb6c0ba18780c19a8da0c31ace671265e3c87fa' 
kSigning = 'f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d' 

http://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html

は、以下の入力

secretkey = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY' 
dateStamp = '20151229' 
regionName = 'us-east-1' 
serviceName = 's3' 

StringToSign eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXQifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sDQogICAgeyJ4LWFtei1tZXRhLXV1aWQiで失敗しますOiAiMTQzNjUxMjM2NTEyNzQifSwNCiAgICB7IngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24iOiAiQUVTMjU2In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sDQoNCiAgICB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LA0KICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwNCiAgICB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfQ0KICBdDQp9

正しい署名: 46503978d3596de22955b4b18d6dfb1d54e8c5958727d5bdcd02cc1119c60fc9 私の署名: e7318f0bfd7d86fb9ba81c314f62192ee2baf7273792ef01ffafeb430fc2fb68

http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html

マイコード

var crypto = require("crypto-js") 

module.exports.getSignatureKey = function(key, dateStamp, regionName, serviceName) { 
    var kSecret = "AWS4" + key 
    var kDate = crypto.HmacSHA256(dateStamp, kSecret) 
    var kRegion = crypto.HmacSHA256(regionName, kDate) 
    var kService = crypto.HmacSHA256(serviceName, kRegion) 
    var kSigning = crypto.HmacSHA256("aws4_request", kService) 
    return kSigning; 
} 

module.exports.sign = function(signatureKey,stringToSign) { 
    var unencodedSignature = crypto.HmacSHA256(stringToSign,signatureKey) 
    return unencodedSignature 
} 

module.exports.getSignature = function(stringToSign,secretKey,dateStamp,regionName, serviceName) { 
    var signingKey = this.getSignatureKey(secretKey,dateStamp,regionName,serviceName) 

    return this.sign(signingKey,stringToSign) 
} 
+0

あなた自身が署名コードを書こうと思っていますが、もちろん、NPM aws4モジュールやAWS JavaScript SDKなどの他のオプションがあることを言いたいだけです。 – jarmod

+0

@jarmod部分的には、私が髪を引っ張っていたときにタオルを投げて、特にs3アップロード用の2つのノードモジュールを試しました。私は両方を使用して失敗しました。正直なところ、3つの機能でこれを行うことができるとすれば、既存のNpmモジュールがなぜ冗長であるのかわかりません。 –

答えて

1

第2のリンクにおけるAWSの例では、間違った署名を持っています。私のソリューションを使用して、s3に正常にアップロードできました。

何か他の点は、crypto-jsノードライブラリが既に16進数で署名を出力していることです。 Theresは、あなたが提供するサンプルコードを使用してJavaを使用する場合と同じように、手動での変換を自分で行う必要はありません。

関連する問題