zoukankan      html  css  js  c++  java
  • Java加密技术(一)—— HMACSHA1 加密算法

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

  • 相关阅读:
    谎言,
    happy,
    架构,
    休闲游戏随想,
    IOS响应者链
    application 几个方法
    ios block 循环引用
    洛谷 P 1133 教主的花园
    Codevs 1148 == 洛谷 P1057 传球游戏
    Codevs 1169 == 洛谷 P1006 传纸条
  • 原文地址:https://www.cnblogs.com/edgedance/p/6979602.html
Copyright © 2011-2022 走看看