Amazon Elastic MapReduce
Developer Guide (API Version 2009-11-30)
Print this pageEmail this pageGo to the ForumsView the PDFShare this page on TwitterShare this page on FacebookBookmark this page on DeliciousSubmit this page to RedditSubmit this page to DiggDid this page help you?  Yes  No   Tell us about it...

Using the Java SDK to Sign a Query Request

The following example uses the amazon.webservices.common package of the AWS SDK for Java to generate an AWS signature version 2 Query request signature. To do so, it creates an RFC 2104-compliant HMAC signature. For more information about HMAC, go to HMAC: Keyed-Hashing for Message Authentication. For more information about how to format and sign Query requests using AWS signature version 2, go to How to Generate a Signature for a Query Request in Amazon EMR

[Note]Note

Java is used in this case as a sample implementation, you can use the programming language of your choice to implement the HMAC algorithm to sign Query requests.

 package amazon.webservices.common;

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

 /**
 * This class defines common routines for generating
 * authentication signatures for AWS Platform requests.
 */
 public class Signature {
 private static final String HMAC_SHA1_ALGORITHM = "HmacSHA256";


 /**
 * Computes RFC 2104-compliant HMAC signature.
 * * @param data
 * The signed data.
 * @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;
 }