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

Java加密技术(一)—— HMACSHA1 加密算法的相关文章

Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC

http://snowolf.iteye.com/blog/379860 加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了.     言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书.     如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) H

Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC

加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了. 言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书. 如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) HMAC(Hash Message Authentication Code,散列消息鉴别码)

Java加密技术(二)——对称加密算法DES&AES

接下来我们介绍对称加密算法,最常用的莫过于DES数据加密算法. DES DES-Data Encryption Standard,即数据加密算法.是IBM公司于1975年研究成功并公开发表的.DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密. DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位. 通过java

Java加密技术(七)——非对称加密算法最高级ECC

ECC ECC-Elliptic Curves Cryptography,椭圆曲线密码编码学,是目前已知的公钥体制中,对每比特所提供加密强度最高的一种体制.在软件注册保护方面起到很大的作用,一般的序列号通常由该算法产生. 当我开始整理<Java加密技术(二)>的时候,我就已经在开始研究ECC了,但是关于Java实现ECC算法的资料实在是太少了,无论是国内还是国外的资料,无论是官方还是非官方的解释,最终只有一种答案--ECC算法在jdk1.5后加入支持,目前仅仅只能完成密钥的生成与解析. 如果想

Java 加密解密之对称加密算法AES

Java 加密解密之对称加密算法AES 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准.2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一.该算法

Java加密技术(八)——数字证书

本篇的主要内容为Java证书体系的实现. 请大家在阅读本篇内容时先阅读 Java加密技术(四),预先了解RSA加密算法. 在构建Java代码实现前,我们需要完成证书的制作. 1.生成keyStroe文件 在命令行下执行以下命令: Shell代码   keytool -genkey -validity 36000 -alias www.zlex.org -keyalg RSA -keystore d:\zlex.keystore keytool -genkey -validity 36000 -a

Java加密技术(十)——单向认证

在 Java 加密技术(九)中,我们使用自签名证书完成了认证.接下来,我们使用第三方CA签名机构完成证书签名. 这里我们使用 thawte提供的测试用21天免费ca证书. 1.要在该网站上注明你的域名,这里使用 www.zlex.org作为测试用域名(请勿使用该域名作为你的域名地址,该域名受法律保护!请使用其他非注册域名!). 2.如果域名有效,你会收到邮件要求你访问 https://www.thawte.com/cgi/server/try.exe获得ca证书. 3.复述密钥库的创建. She

Java加密技术(十二)——*.PFX(*.p12)&个人信息交换文件

今天来点实际工作中的硬通货! 与计费系统打交道,少不了用到加密/解密实现.为了安全起见,通过非对称加密交换对称加密密钥更是不可或缺.那么需要通过什么载体传递非对称算法公钥/私钥信息?数字证书是公钥的载体,而密钥库可以包含公钥.私钥信息. JKS和 PKCS#12都是比较常用的两种密钥库格式/标准.对于前者,搞Java开发,尤其是接触过HTTPS平台的朋友,并不陌生. JKS文件(通常为*.jks或*.keystore,扩展名无关)可以通过Java原生工具--KeyTool生成:而后者 PKCS#

Java加密技术(四)非对称加密算法RSA

RSA  这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman. 这种加密算法的特点主要是密钥的变化,上文我们看到DES只有一个密钥.相当于只有一把钥匙,如果这把钥匙丢了,数据也就不安全了.RSA同时有两把钥匙,公钥与私钥.同时支持数字签名.数字签名的意义在于,对传输过来的数据进行校验.确保数据在传输工程中不被修改. 流程分析: 甲方构建

加密技术及常见加密算法

有了互联网的同时给我们的日常生活带来了不少的便利,与此同时也给我们带来了不少的安全隐患,可能你在和别人通信的同时,通信数据就被别人截获了,所以就必须要有一种相应的加密技术,来保护我们的通信隐私.那么今天就大家来简单的了解一下加密技术及一些常见的加密算法. 1.为什么需要加密 1.不加密流量的易受攻击性 2.不加密密码/数据容易被嗅探 3.不加密数据容易被操作 4.不加密无法验证操作 5.不加密相当于邮寄明信片 2.不安全的传统协议 telnet.FTP.POP3等等:不安全密码 http.smt