Amazon Elastic MapReduce
Developer Guide (API Version 2009-03-31)
« PreviousNext »
View the PDF for this guide.Go to the AWS Discussion Forum for this product.Go to the Kindle Store to download this guide in Kindle format.Did 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

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;
 }