博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java加密技术(一)—— HMACSHA1 加密算法
阅读量:4973 次
发布时间:2019-06-12

本文共 1767 字,大约阅读时间需要 5 分钟。

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

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

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

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

[java]   
  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. }  

转载于:https://www.cnblogs.com/edgedance/p/6979602.html

你可能感兴趣的文章
Eclipse修改编码格式
查看>>
生成器和协程 —— 你想知道的都在这里了
查看>>
初级算法-6.两个数组的交集 II
查看>>
欧拉函数 / 蒙哥马利快速幂 / 容斥
查看>>
Makefile
查看>>
软件开发文档以及项目开发流程理解
查看>>
2019微软Power BI 每月功能更新系列——Power BI 4月版本功能完整解读
查看>>
truncate 、delete、drop的区别
查看>>
DynamoDB 中的限制
查看>>
mysql做主从配置
查看>>
Docker练习例子:基于 VNCServer + noVNC 构建 Docker 桌面系统
查看>>
《码出高效 Java开发手册》第六章 数据结构与集合
查看>>
Python获取本机外网IP
查看>>
sleep和wait的区别
查看>>
[导入]弯管机3D DEMO
查看>>
关于51单片机使用printf串口调试
查看>>
软件工程-读书笔记(1-3章)
查看>>
Sublime 快捷键
查看>>
GNU make manual 翻译(二十六)
查看>>
poj1436
查看>>