Java签名算法之HMAC-SHA1


-

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 = BASE64Encoder.encode(rawHmac);
//			result = Encoding.EncodeBase64(rawHmac);

		} catch (Exception e) {
			throw new SignatureException("Failed to generate HMAC : "
					+ e.getMessage());
		}
		return result;
	}
	
	public static byte[] hmacSHA1(String data, String key) throws java.security.SignatureException {
		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());

			return rawHmac;

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

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SignatureException;
import java.util.Formatter; 
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;  
/** 
 * The <tt>HmacSha1Signature</tt> shows how to calculate  
 * a message authentication code using HMAC-SHA1 algorithm. 
 * 
 * <pre> 
 * % java -version 
 * java version "1.6.0_11" 
 * % javac HmacSha1Signature.java  
 * % java -ea HmacSha1Signature 
 * 104152c5bfdca07bc633eebd46199f0255c9f49d 
 * </pre> 
 * 
 */
 public class HmacSha1Signature {	
     private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1"; 	
     private static String toHexString(byte[] bytes) {		
         Formatter formatter = new Formatter();				
         for (byte b : bytes) {			
             formatter.format("%02x", b);		、
         } 		
         return formatter.toString();	
    } 	
    
    public static String calculateRFC2104HMAC(String data, String key) throws SignatureException, NoSuchAlgorithmException, InvalidKeyException	{		
        SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM);		Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);		
        mac.init(signingKey);		
        return toHexString(mac.doFinal(data.getBytes()));	
     } 	
     
     public static void main(String[] args) throws Exception {		
         String hmac = calculateRFC2104HMAC("data", "key"); 		
         System.out.println(hmac);		
         assert hmac.equals("104152c5bfdca07bc633eebd46199f0255c9f49d");	
     }
}

-

你可能感兴趣的:(Java签名算法之HMAC-SHA1)