Java加密技术(一)—— HMACSHA1 加密算法

时间:2022-06-05 17:39:51

HMACSHA1 是从 SHA1 哈希函数构造的一种键控哈希算法,被用作 HMAC(基于哈希的消息验证代码)。 此 HMAC 进程将密钥与消息数据混合,使用哈希函数对混合结果进行哈希计算,将所得哈希值与该密钥混合,然后再次应用哈希函数。 输出的哈希值长度为 160 位。

在发送方和接收方共享机密密钥的前提下,HMAC 可用于确定通过不安全信道发送的消息是否已被篡改。 发送方计算原始数据的哈希值,并将原始数据和哈希值放在一个消息中同时传送。 接收方重新计算所接收消息的哈希值,并检查计算所得的 HMAC 是否与传送的 HMAC 匹配。

因为更改消息和重新生成正确的哈希值需要密钥,所以对数据或哈希值的任何更改都会导致不匹配。 因此,如果原始的哈希值与计算得出的哈希值相匹配,则消息通过身份验证。

SHA-1(安全哈希算法,也称为 SHS、安全哈希标准)是由美国*发布的一种加密哈希算法。 它将从任意长度的字符串生成 28位长的字符串。

[java] view plain copy
  1. import java.security.InvalidKeyException;  
  2. import java.security.NoSuchAlgorithmException;  
  3.   
  4. import javax.crypto.Mac;  
  5. import javax.crypto.spec.SecretKeySpec;  
  6.   
  7. import org.apache.commons.codec.binary.Base64;  
  8.   
  9. /** 
  10.  * HMAC_SHA1 Sign生成器. 
  11.  *  
  12.  * 需要apache.commons.codec包 
  13.  *  
  14.  */  
  15. public class HMAC_SHA1 {  
  16.   
  17.     private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";  
  18.   
  19.     /** 
  20.      * 使用 HMAC-SHA1 签名方法对data进行签名 
  21.      *  
  22.      * @param data 
  23.      *            被签名的字符串 
  24.      * @param key 
  25.      *            密钥      
  26.      * @return  
  27.                       加密后的字符串 
  28.      */  
  29.     public static String genHMAC(String data, String key) {  
  30.         byte[] result = null;  
  31.         try {  
  32.             //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称    
  33.             SecretKeySpec signinKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM);  
  34.             //生成一个指定 Mac 算法 的 Mac 对象    
  35.             Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);  
  36.             //用给定密钥初始化 Mac 对象    
  37.             mac.init(signinKey);  
  38.             //完成 Mac 操作     
  39.             byte[] rawHmac = mac.doFinal(data.getBytes());  
  40.             result = Base64.encodeBase64(rawHmac);  
  41.   
  42.         } catch (NoSuchAlgorithmException e) {  
  43.             System.err.println(e.getMessage());  
  44.         } catch (InvalidKeyException e) {  
  45.             System.err.println(e.getMessage());  
  46.         }  
  47.         if (null != result) {  
  48.             return new String(result);  
  49.         } else {  
  50.             return null;  
  51.         }  
  52.     }  
  53.     /** 
  54.      * 测试 
  55.      * @param args 
  56.      */  
  57.     public static void main(String[] args) {  
  58.         String genHMAC = genHMAC("111""2222");  
  59.         System.out.println(genHMAC.length()); //28  
  60.         System.out.println(genHMAC);  // O5fviq3DGCB5NrHcl/JP6+xxF6s=  
  61.     }  
  62. }