0
String stringToSign = "GET" + "\n" +
                    "webservices.amazon.com" + "\n" +
                    "/onca/xml" + "\n" +
                    "AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&ItemId=0679722769&Operation=ItemLookup&ResponeGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06";


    SecretKeySpec keySpec = new SecretKeySpec(
            "1234567890".getBytes(),
            "HmacSHA256");

    Mac mac = Mac.getInstance("HmacSHA256");
    mac.init(keySpec);


    byte[] result = mac.doFinal(stringToSign.getBytes());
    String encodedResult = Base64.encodeBase64String(result);
    System.out.println("encodedResult: "+encodedResult);

    String urlEncodedResult = URLEncoder.encode(encodedResult, "UTF-8").replace("+", "%2B").replace("*", "%2A").replace("%7E", "~");
    System.out.println("ulrEncodedResult: "+urlEncodedResult);

これは、AWS の REST 認証用です。私が得る結果は: ulrEncodedResult: k1T%2FqvVoXgEvmdFhTEh71vLDznqEVCyKcslA5RRSB6s%3D

予想される結果: ulrEncodedResult: M%2Fy0%2BEAFFGaUAp4bWv%2FWEuXYah99pVsxvqtAuC8YN7I%3D

認証の正確な手順はすべてここに示されています: http://docs.aws.amazon.com/AWSECommerceService/2011-08-01/DG/rest-signature.html

誰かが私が犯している間違いを見つけることができますか?

4

1 に答える 1

0

懸念事項の 1 つは、次のことです。

"1234567890".getBytes()

この

stringToSign.getBytes()

使用する文字エンコーディングを指定しないでください (例: UTF8)。プラットフォームまたは JVM の設定に依存し、必要なものとは異なる場合があります (UTF8 と思われます)。getBytes(CharSet)バリアントを使用することをお勧めします。

于 2013-07-03T09:15:33.647 に答える