1

これが私のジレンマです。Java コードを読むことには慣れていますが、書くのは苦手です。アマゾンのドキュメントからいくつかの例がありますが、何か間違っています。私はエクリプスを使用しています。私は AWS Java SDK、Apache Commons Codec & Logging、および Base64 を持っています。プロジェクト内の適切なクラスパスにすべてのコードがあります。

リクエストの作成方法 (要素の順序、タイムスタンプなど) は理解していますが、この情報を Java コードに送信して署名付きリクエストを作成する方法がわかりません。したがって、ドキュメントから使用しているコードから始めます。

署名用コード:

import java.security.SignatureException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

    /**
    * This class defines common routines for generating
    * authentication signatures for AWS requests.
    */
    public class Signature {
        private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";
    /**
    * Computes RFC 2104-compliant HMAC signature.
    * * @param data
    * The data to be signed.
    * @param key
    * The signing key.
    * @return
    * The Base64-encoded RFC 2104-compliant HMAC signature.
    * @throws
    * java.security.SignatureException when signature generation fails
    */
        public static String calculateRFC2104HMAC(String data, String key)
                throws java.security.SignatureException
        {
            String result;
            try {

                // get an hmac_sha1 key from the raw key bytes
                SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM);

                // get an hmac_sha1 Mac instance and initialize with the signing key
                Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
                mac.init(signingKey);

                // compute the hmac on input data bytes
                byte[] rawHmac = mac.doFinal(data.getBytes());

                // base64-encode the hmac
                result = Encoding.EncodeBase64(rawHmac);

            } catch (Exception e) {
                throw new SignatureException("Failed to generate HMAC : " + e.getMessage());
            }
            return result;
        }
}

エンコードのコード:

/**
* This class defines common routines for encoding * data in AWS requests.
*/
public class Encoding {
    /**
    * Performs base64-encoding of input bytes.
    *
    * @param rawData * Array of bytes to be encoded.
    * @return * The base64 encoded string representation of rawData.
    */
    public static String EncodeBase64(byte[] rawData) {
        return Base64.encodeBytes(rawData);
    }
}

リクエストに署名するために思いついたコード:

import java.security.SignatureException;

public class SignatureTest {
    /**
     * @param args
     * @throws SignatureException
     */
    public static void main( String[] args ) throws SignatureException {
        // data is the URL parameters and time stamp to be encoded
        String data = "<data-to-encode>";
        // key is the secret key
        String key = "<my-secret-key>";
        Signature.calculateRFC2104HMAC(data, key);
    }
}

最初は、クラスパスに関連するエラーが発生していたので、それらをプロジェクトに追加しました。コードを実行すると、エラーも応答もなく、コマンド プロンプトに戻るだけです。これはおそらく簡単な解決策だと思います。私はこれを理解しようと一週間を費やしましたが、答えを見つけることに成功しませんでした. 誰かが私を正しい方向に向けることができますか?

注: サイズが大きいため、ここには Base64 コードを含めませんでしたが、私のプロジェクトにはあります。

4

1 に答える 1