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 keythrows 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 keythrows 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");	
     }
}
    原文作者:推荐算法
    原文地址: https://yq.aliyun.com/articles/44616
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞