HmacSHA 和HmacMd5   加密算法实现

package com.asiainfo.encryption.s2;

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SignatureException;
import java.util.Formatter;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Encoder;

public class HmacSignature {

	private static final String HMAC_SHA1_ALGORITHM = "HMACSHA1"; //算法名称 etc: HMACSHA256、HMACSHA384、HMACSHA512、HMACMD5、(jdk 没有提供HMACSHA224的算法实现)
	                                                              
	private static String toHexString(byte[] bytes) {
		Formatter formatter = new Formatter();
		for (byte b : bytes) {
			formatter.format("%02x", b);
		}
		String hexString = formatter.toString();
		formatter.close();
		return hexString;
	}

	public static String calculateRFC2104HMAC(String data, String key) throws SignatureException, NoSuchAlgorithmException, InvalidKeyException {
		SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM);
		Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
		mac.init(signingKey);
		return toHexString(mac.doFinal(data.getBytes()));
	}

	public static String calculateRFC2104HMAC(String data, byte[] key) throws SignatureException, NoSuchAlgorithmException, InvalidKeyException {
		SecretKeySpec signingKey = new SecretKeySpec(key, HMAC_SHA1_ALGORITHM);
		Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
		mac.init(signingKey);
		return toHexString(mac.doFinal(data.getBytes()));
	}

	public static void main(String[] args) throws Exception {
		KeyGenerator generator = KeyGenerator.getInstance(HMAC_SHA1_ALGORITHM);
		SecretKey key = generator.generateKey();
		byte[] digest = key.getEncoded();

		BASE64Encoder encoder = new BASE64Encoder();
		String encoderDigest = encoder.encodeBuffer(digest);
		encoderDigest = encoderDigest.replaceAll("[^(A-Za-z0-9)]", ""); //如果想看到生成的密钥
		System.out.println("Base64编码后的密钥:" + encoderDigest);
		String content = "一代宗师";
		System.out.println("明文: " + content);
		String hmac = calculateRFC2104HMAC(content, encoderDigest);
		System.out.println("密文: " + hmac);
	}
}

最终输出: 
Base64编码后的密钥:lwfmhK3H0qmTOfLGjDZ5HwHhz14enep7P7qXncxvNXWqUWWJMCvA6cqWP3GuvKtE2ArscZSF0lSaRH9jXg
明文: 美女
密文: 719e053be349ca02a721a3d6b509e84e21f7a0c5
时间: 2024-10-12 09:43:16

HmacSHA 和HmacMd5   加密算法实现的相关文章

2-7-搭建DNS服务器实现域名解析

学习服务的方法: 了解服务的作用:名称,功能,特点 安装服务 配置文件的位置,端口 服务开启和关闭的脚本 修改配置文件(实战举例) 排错(从上到下,从内到外) ---------------------------------------- 大纲: DNS服务器常见概念 DNS服务器安装及相关配置 实战:配置DNS服务器解析 实战:使用DNS支持递归查询. 实战:搭建DNS转发服务器 实战:搭建DNS主从服务器 实战:zone文件中的其它记录信息. 通过DNS做负载均衡 实战:DNS主从密钥认证

DDNS在生产环境中的应用

1.DDNS(DynamicDomain Name Server)动态域名服务介绍 1.1 介绍: DDNS是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候,客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务器程序负责提供DNS服务并实现动态域名解析. 1.2 实验环境说明: 系统:Centos 6.5 DDNS:DHCP + DNS(Bind9), DHCP和DNS服务器为同一台(IP:10.0.0.103) 域名: ilo-z

DNS高级应用

添加从DNS服务器 配置从DNS服务器,先要使主从DNS服务器在时间上同步,这个可以参考时间服务器的搭建.主DNS服务器用"DNS服务器的搭建"里面配置的DNS服务器吧!从DNS服务器的作用是可以帮助主DNS服务器减少负载,从DNS服务器上的解析库文件来自于主DNS服务器,当主DNS服务器出现故障后,从DNS服务器在超时时间内没有联系上主DNS服务器,则也会停止提供解析服务. 从DNS的配置比较简单,只需要在配置文件中添加相应的区域即可,而不需要区域解析库文件(同步主DNS服务器而来)

7.DNS服务

一.概述 DNS(Domain Name System)域名系统在TCP/IP网络中提供域名与IP地址的解析服务. 1.域和域名 (1)DNS树的每个节点代表一个域,通过这些节点,对整个域名空间进行划分,成为一个层次结构.域名空间的每个域的名字,通过域名进行表示. (2)域名:通常由一个完全合格域名(FQDN)标识.FQDN能准确表示出其相对于DNS域树根的位置,也就是节点到DNS树根的完全表述方式,从节点到树根采用反向书写,并将每个节点用"."分隔,对于DNS域google来说,其完

bind9.8搭建dns服务器

系统:Centos6.7 64位 内核:2.6.32-573.el6.x86_64 软件: bind-9.8.2-0.47.rc1.el6_8.2.x86_64 bind-utils-9.8.2-0.47.rc1.el6_8.2.x86_64 ind-libs-9.8.2-0.47.rc1.el6_8.2.x86_64 参考:bind9手册 软件简单介绍: bind(Berkeley Internet Name Domain)是一种dns协议的实现.bind软件包含3个部分:dns server

2-5-搭建DNS服务器实现域名解析

学习一个服务的过程: 1.  此服务器的概述:名字,功能,特点,端口号 2.  安装 3.  配置文件的位置 4.  服务启动关闭脚本,查看端口 5.  此服务的使用方法 6.  修改配置文件,实战举例 7.  排错(从下到上,从内到外) 本节所讲内容: ?        DNS服务器常见概念 ?        DNS服务器安装及相关配置文件 ?        实战:为公司内网搭建一个DNS服务器 ?        实战:设置DNS递归查询和迭代查询 ?        实现:搭建DNS主从服务器

配置 bind DNS 服务器器

DNS服务器常见概念 DNS服务概述: DNS(Domain Name System--域名系统),在TCP/IP 网络中有着非常重要的地位,能够提供域名和IP地址的解析服务. DNS是一个分布式数据库,命名系统采用层次的逻辑结构,如同一颗倒置的树,这个逻辑的树形结构称为域名空间,由于DNS划分了域名空间,所以各机构可以使用自己的域名空间创建DNS信息. 注:DNS域名空间中,树的最大深度不得超过127层,树中每个节点最长可以存储63个字符. 一些名词的解释: 域和域名 DNS树的每个节点代表一

散列哈希加密

/// <summary> /// 散列哈希加密(MD5 SHA HMACSHA) /// </summary> public static class HashAlgorithmEncrypt { /// <summary> ///返回值类型 /// </summary> public enum UpperLower { /// <summary> /// 大写 /// </summary> Upper, /// <summa

常见加密算法

常见的加密算法可以分成三类,对称加密算法,公钥加密算法和单向加密算法. 对称加密 指加密和解密使用相同密钥的加密算法.对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性.假设两个用户需要使用对称加密方法加密然后交换数据,则用户最少需要2个密钥并交换使用,如果企业内用户有n个,则整个企业共需要n×(n-1) 个密钥,密钥的生成和分发将成为企业信息部门的恶梦.对称加密算法的安全性取决于加密密钥的保存情况,但要求企业中每一个持有密钥的人都保守秘密是不可能的,他们通常会有意无意的把密钥泄漏出去