zoukankan      html  css  js  c++  java
  • HMAC的JAVA实现和应用

    1、简介: 

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

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

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

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

    HMACSHA1 接受任何大小的密钥,并产生长度为 160 位的哈希序列。

    2、实现(Java版本):

     1 import javax.crypto.Mac;
     2 import javax.crypto.SecretKey;
     3 import javax.crypto.spec.SecretKeySpec;
     4 
     5 public class HMACSHA1 {
     6 
     7     private static final String MAC_NAME = "HmacSHA1";  
     8     private static final String ENCODING = "UTF-8";  
     9     
    10     /*
    11      * 展示了一个生成指定算法密钥的过程 初始化HMAC密钥 
    12      * @return 
    13      * @throws Exception
    14      * 
    15       public static String initMacKey() throws Exception {
    16       //得到一个 指定算法密钥的密钥生成器
    17       KeyGenerator KeyGenerator keyGenerator =KeyGenerator.getInstance(MAC_NAME); 
    18       //生成一个密钥
    19       SecretKey secretKey =keyGenerator.generateKey();
    20       return null;
    21       }
    22      */
    23     
    24     /** 
    25      * 使用 HMAC-SHA1 签名方法对对encryptText进行签名 
    26      * @param encryptText 被签名的字符串 
    27      * @param encryptKey  密钥 
    28      * @return 
    29      * @throws Exception 
    30      */  
    31     public static byte[] HmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception   
    32     {         
    33         byte[] data=encryptKey.getBytes(ENCODING);
    34         //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
    35         SecretKey secretKey = new SecretKeySpec(data, MAC_NAME); 
    36         //生成一个指定 Mac 算法 的 Mac 对象
    37         Mac mac = Mac.getInstance(MAC_NAME); 
    38         //用给定密钥初始化 Mac 对象
    39         mac.init(secretKey);  
    40         
    41         byte[] text = encryptText.getBytes(ENCODING);  
    42         //完成 Mac 操作 
    43         return mac.doFinal(text);  
    44     }  
    45 }

    3、HMAC在YS开放平台的应用:

    (1)、第三方申请接入YS开放平台,获得一个授权ID和一个用于签名的密钥,YS平台后台会记录ID和密钥的关联关系。

    (2)、第三方平台在调用YS平台接口时,要求带上授权ID和对调用接口进行签名。

    (3)、YS平台通过授权ID获取到对应的密钥进行验签,如果通过则处理请求。

    (4)、YS平台允许第三方更新密钥。

    4、使用HMAC防伪造:

    攻击者截包然后进行重放是常见的攻击手法,使用HMAC能有效防止伪造用户身份进行攻击,过程如下:

    (1)、在签名参数中加入时间戳,并在接口调用中带上明文的时间戳。

    (2)、后台在接收到请求时验证时间戳和服务器的时间差,如果超过超过时间窗则不予以处理。

    由此可见,由于经过了签名,攻击者不能修改包括时间参数在内的任何参数,因此,最多只能在指定的时间窗口内对包未经修改地重放

    5、总结:

      通信过程中常见的威胁有:篡改、伪造和泄密。HMAC一种用来防篡改和防伪造的有效手段,但不是防泄密的方法,因此,包含了敏感数据的信息还是要经过加密才能传输。此外,对于极为敏感只能进行一次性操作的接口(比如转账),还应带上一次性的token做校验,避免攻击者在时间窗内的连续重放的恶意攻击,最简单的方式还是使用SSL,为防止SSL中间人攻击,如果可能的话,在建立链接的过程中还应主动校验服务器证书的有效性。

  • 相关阅读:
    Nginx 部署多个 web 项目(虚拟主机)
    Nginx 配置文件
    Linux 安装 nginx
    Linux 安装 tomcat
    Linux 安装 Mysql 5.7.23
    Linux 安装 jdk8
    Linux 安装 lrzsz,使用 rz、sz 上传下载文件
    springMVC 拦截器
    spring 事务
    基于Aspectj 注解实现 spring AOP
  • 原文地址:https://www.cnblogs.com/jtlgb/p/10868394.html
Copyright © 2011-2022 走看看