1、简介:

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

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

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

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

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

2、实现(Java版本):

 import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec; public class HMACSHA1 { private static final String MAC_NAME = "HmacSHA1";
private static final String ENCODING = "UTF-8"; /*
* 展示了一个生成指定算法密钥的过程 初始化HMAC密钥
* @return
* @throws Exception
*
public static String initMacKey() throws Exception {
//得到一个 指定算法密钥的密钥生成器
KeyGenerator KeyGenerator keyGenerator =KeyGenerator.getInstance(MAC_NAME);
//生成一个密钥
SecretKey secretKey =keyGenerator.generateKey();
return null;
}
*/ /**
* 使用 HMAC-SHA1 签名方法对对encryptText进行签名
* @param encryptText 被签名的字符串
* @param encryptKey 密钥
* @return
* @throws Exception
*/
public static byte[] HmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception
{
byte[] data=encryptKey.getBytes(ENCODING);
//根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);
//生成一个指定 Mac 算法 的 Mac 对象
Mac mac = Mac.getInstance(MAC_NAME);
//用给定密钥初始化 Mac 对象
mac.init(secretKey); byte[] text = encryptText.getBytes(ENCODING);
//完成 Mac 操作
return mac.doFinal(text);
}
}

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中间人攻击,如果可能的话,在建立链接的过程中还应主动校验服务器证书的有效性。

HMAC的JAVA实现和应用的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. 【java】之 apache commons-codec 与Apache Digest demo实例,支持md5 sha1 base64 hmac urlencode

    使用commons-codec 进行加密的一些操作 package com.jiepu.ApacheDigest; import java.io.FileInputStream; import org ...

  3. BASE64,MD5,SHA,HMAC加密與解密算法(java)

    package com.ice.webos.util.security; import java.io.UnsupportedEncodingException; import java.math.B ...

  4. Java实现 Base64、MD5、MAC、HMAC加密

    开始对那些基本的加密还不怎么熟练,然后总结了些,写了一个测试:支持 Base64.MD5.MAC.HMAC加密,长话短说,我们都比较喜欢自己理解,看代码吧! 采用的输UTF-8的格式... packa ...

  5. Java实现 Base64、MD5、MAC、HMAC加密(转)

    开始对那些基本的加密还不怎么熟练,然后总结了些,写了一个测试:支持 Base64.MD5.MAC.HMAC加密,长话短说,我们都比较喜欢自己理解,看代码吧! 采用的输UTF-8的格式... packa ...

  6. 4.Java 加解密技术系列之 HMAC

    Java 加解密技术系列之 HMAC 序 背景 正文 代码 结束语 序 上一篇文章中简单的介绍了第二种单向加密算法 — —SHA,同时也给出了 SHA-1 的 Java 代码.有这方面需求的童鞋可以去 ...

  7. java 创建 HMAC 签名

    ava 创建 HMAC 签名 psd素材 1. []ComputopTest.java package com.javaonly.hmac.test; import java.io.IOExcepti ...

  8. Java Base64、HMAC、SHA1、MD5、AES DES 3DES加密算法

    ●  BASE64 严格地说,属于编码格式,而非加密算法    ●  MD5(Message Digest algorithm 5,信息摘要算法)    ●  SHA(Secure Hash Algo ...

  9. Java 加解密技术系列文章

    Java 加解密技术系列之 总结 Java 加解密技术系列之 DH Java 加解密技术系列之 RSA Java 加解密技术系列之 PBE Java 加解密技术系列之 AES Java 加解密技术系列 ...

随机推荐

  1. Yii 1.1.17 六、开启路由与使用缓存

    一.开启路由 1.在配置文件main.php的components中 定义如下: // 定义路由 'urlManager'=>array( // URL模式为PATHINFO 'urlForma ...

  2. Linux内核基础--事件通知链(notifier chain)【转】

    转自:http://blog.csdn.net/wuhzossibility/article/details/8079025 内核通知链 1.1. 概述 Linux内核中各个子系统相互依赖,当其中某个 ...

  3. 类似于input输入框placeholder的效果,兼容ie8

    $(function(){    //判断浏览器是否支持placeholder属性  supportPlaceholder='placeholder'in document.createElement ...

  4. http协议及http协议和tcp协议的区别

    http是应用层的协议,并且无连接,无状态的协议. http协议的特点: 1.支持c/s模式 2.简单快速:客户端向服务器端传送数据的时候,只需要发送请求方法和路径,请求方法有:post,get,he ...

  5. LeetCode212. Word Search II

    https://leetcode.com/problems/word-search-ii/description/ Given a 2D board and a list of words from ...

  6. hdu 3078(LCA的在线算法)

    Network Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  7. 理解JWT(Json Web Token)

    这篇文章写得不错: 理解JWT(JSON Web Token)认证及python实践,这里不做转载,仅摘要如下,有删改,仅做个人学习,感谢原作者. 常用认证机制: 1)HTTP basic Auth: ...

  8. 前端学习——css(初级)

    1.Css盒模型(box model) web开发中,html的每个元素都是盒子,盒子可以装内容(content).可以有填充物(padding).有外壳(border) 和 外保护层(margin) ...

  9. centos 时间日期设置

    date  时间窗口 date -s '2015-02-02 10:10:00'  更改年月日小时分秒 date -s 10:00:02  只更改时间 不更改年月 clock -w 写入系统时间 hw ...

  10. 跨域请求httpclient

    httpclient:是Apache工具包,util,它可以作为一个爬虫,直接爬取某个互联网上的页面.获取到时页面最终的源文件html.直接可以获取页面返回json.就可以直接在代码内部模拟发起htt ...