当前位置: 首页 > news >正文

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

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

采用的输UTF-8的格式...

  1 package visec;
  2 import java.security.MessageDigest;
  3 import javax.crypto.KeyGenerator;
  4 import javax.crypto.Mac;
  5 import javax.crypto.SecretKey;
  6 import javax.crypto.spec.SecretKeySpec;
  7 
  8 import Decoder.BASE64Decoder;
  9 import Decoder.BASE64Encoder;
 10 /**
 11  * 基础加密组件
 12  * @author Visec·Dana
 13  * @version 1.0
 14  * @since 1.0
 15  */
 16 public abstract class Coder {
 17     public static final String KEY_SHA = "SHA";
 18     public static final String KEY_MD5 = "MD5";
 19 
 20     /**
 21      * MAC算法可选以下多种算法
 22      * <pre>
 23      * HmacMD5 
 24      * HmacSHA1 
 25      * HmacSHA256 
 26      * HmacSHA384 
 27      * HmacSHA512
 28      * </pre>
 29      */
 30     public static final String KEY_MAC = "HmacMD5";
 31 
 32     /**
 33      * BASE64解密
 34      * @param key
 35      * @return
 36      * @throws Exception
 37      */
 38     public static byte[] decryptBASE64(String key) throws Exception {
 39         return (new BASE64Decoder()).decodeBuffer(key);
 40     }
 41 
 42     /**
 43      * BASE64加密
 44      * @param key
 45      * @return
 46      * @throws Exception
 47      */
 48     public static String encryptBASE64(byte[] key) throws Exception {
 49         return (new BASE64Encoder()).encodeBuffer(key);
 50     }
 51     /**
 52      * MD5加密
 53      * @param data
 54      * @return
 55      * @throws Exception
 56      */
 57     public static byte[] encryptMD5(byte[] data) throws Exception {
 58 
 59         MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
 60         md5.update(data);
 61         return md5.digest();
 62 
 63     }
 64     /**
 65      * SHA加密
 66      * @param data
 67      * @return
 68      * @throws Exception
 69      */
 70     public static byte[] encryptSHA(byte[] data) throws Exception {
 71         MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
 72         sha.update(data);
 73         return sha.digest();
 74 
 75     }
 76     /**
 77      * 初始化HMAC密钥
 78      * @return
 79      * @throws Exception
 80      */
 81     public static String initMacKey() throws Exception {
 82         KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
 83         SecretKey secretKey = keyGenerator.generateKey();
 84         return encryptBASE64(secretKey.getEncoded());
 85     }
 86     /**
 87      * MAC加密
 88      * @param data
 89      * @param key
 90      * @return
 91      * @throws Exception
 92      */
 93     public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
 94         SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
 95         Mac mac = Mac.getInstance(secretKey.getAlgorithm());
 96         mac.init(secretKey);
 97         return mac.doFinal(data);
 98 
 99     }
100 }

下面是一个测试类,及输入命令

 1 package visec;
 2 
 3 import java.math.BigInteger;
 4 
 5 /**
 6  * 加密测试
 7  * @author Visec·Dana
 8  * @version 1.0
 9  * @since 1.0
10  */
11 public class CoderTest {
12     public static void main(String[] args) throws Exception {
13         CoderTest.test(); 
14     }
15 
16     public static void test() throws Exception {
17         String inputStr = "这是一些简单的加密测试";
18         System.err.println("原文:" + inputStr);
19 
20         byte[] inputData = inputStr.getBytes();
21         String code = Coder.encryptBASE64(inputData);
22 
23         System.err.println("BASE64加密后:" + code);
24 
25         byte[] output = Coder.decryptBASE64(code);
26 
27         String outputStr = new String(output);
28 
29         System.err.println("BASE64解密后:" + outputStr);
30 
31         //单元测试 Junit4[暂时不用...]
32         /*// 验证BASE64加密解密一致性
33         assertEquals(inputStr, outputStr);
34 
35         // 验证MD5对于同一内容加密是否一致
36         assertArrayEquals(Coder.encryptMD5(inputData), Coder
37                 .encryptMD5(inputData));
38 
39         // 验证SHA对于同一内容加密是否一致
40         assertArrayEquals(Coder.encryptSHA(inputData), Coder
41                 .encryptSHA(inputData));
42 
43         String key = Coder.initMacKey();
44         System.err.println("Mac密钥:/n" + key);
45 
46         // 验证HMAC对于同一内容,同一密钥加密是否一致
47         assertArrayEquals(Coder.encryptHMAC(inputData, key), Coder.encryptHMAC(
48                 inputData, key));
49         */
50         BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData));
51         System.err.println("MD5:" + md5.toString(16));
52 
53         BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));
54         System.err.println("SHA:" + sha.toString(32));
55 
56         BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));
57         System.err.println("HMAC:" + mac.toString(16));
58     }
59 }

下面呢是控制台输出:

原文:这是一些简单的加密测试
BASE64加密后:6L+Z5piv5LiA5Lqb566A5Y2V55qE5Yqg5a+G5rWL6K+V

BASE64解密后:这是一些简单的加密测试
MD5:76757e30d128e82b14488b115794d959
SHA:6f7afslor1oev1k7k40um57cscuqkjtn
HMAC:782313e944a28a55fc20507e50a9d470

转载于:https://www.cnblogs.com/visec479/p/3780295.html

相关文章:

  • 使用Perl/Tk模块建立可视化图形GUI界面2
  • 正则表达式,部分数据验证规则
  • ubuntu loaderrunner 压力测试
  • 从零开始编写自己的C#框架(12)——T4模板在逻辑层中的应用(一)(附源码)...
  • js调试系列: 断点与动态调试[基础篇]
  • Nmap命令的29个实用范例
  • oracle grant 详解(转)
  • 查询百度收录应该以百度蜘蛛索引为准
  • Google搜索的20个简单实用技巧
  • .net wcf memory gates checking failed
  • C#Excel上传批量导入sqlserver
  • Windows Server网络负载均衡技术
  • SQL Server 索引视图 聚簇索引
  • 运维自动化之puppet基础应用解析
  • Log4j发送日志邮件功能
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Java Agent 学习笔记
  • JavaScript服务器推送技术之 WebSocket
  • Mysql数据库的条件查询语句
  • php的插入排序,通过双层for循环
  • spring-boot List转Page
  • SQLServer之索引简介
  • yii2中session跨域名的问题
  • 笨办法学C 练习34:动态数组
  • 扑朔迷离的属性和特性【彻底弄清】
  • 前端设计模式
  • 前嗅ForeSpider教程:创建模板
  • 前言-如何学习区块链
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 算法---两个栈实现一个队列
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 转载:[译] 内容加速黑科技趣谈
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​你们这样子,耽误我的工作进度怎么办?
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (多级缓存)多级缓存
  • (二)JAVA使用POI操作excel
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (一)基于IDEA的JAVA基础1
  • (转)http-server应用
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .bat批处理(六):替换字符串中匹配的子串
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .Net IOC框架入门之一 Unity
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • /proc/vmstat 详解
  • @EventListener注解使用说明
  • @KafkaListener注解详解(一)| 常用参数详解
  • @RequestMapping处理请求异常
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [C++]类和对象(中)