开始对那些基本的加密还不怎么熟练,然后总结了些,写了一个测试:支持 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

Java实现 Base64、MD5、MAC、HMAC加密的更多相关文章

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

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

  2. nodeJS之crypto模块md5和Hmac加密

    nodeJS之crypto模块md5和Hmac加密 原文地址:https://www.cnblogs.com/tugenhua0707/p/9128690.html 在nodejs中,可以使用cryp ...

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

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

  4. iOS常见的几种加密方法(base64.MD5.Token传值.系统指纹验证。。加密)

    普通加密方法是讲密码进行加密后保存到用户偏好设置中 钥匙串是以明文形式保存,但是不知道存放的具体位置 一. base64加密 base64 编码是现代密码学的基础 基本原理: 原本是 8个bit 一组 ...

  5. Java的单向加密算法MD5和SHA——加密和解密

    出自:http://www.cnblogs.com/onetwo/p/3875551.html 1.JDK中MD5和SHA加密的主要类 在JDK6.0中,与MD5与SHA密切相关的几个类的类图如下:  ...

  6. Java 语言实现 MD5 加密

    Java 语言实现 MD5 加密 背景说明 在实际项目中,为了安全性考虑,经常要求账号密码是以加密后的密文形式,保存到数据库中. 这样,即使有人获取到了数据库中的密文密码,也不知道明文密码信息是什么, ...

  7. C#加密解密(DES,AES,Base64,md5,SHA256,RSA,RC4)

    一:异或^简单加解密(数字类型) 1:原理: 异或用于比较两个二进制数的相应位,在执行按位"异或"运算时,如果两个二进制数的相应位都为1或者都为0,则返回0;如果两个二进制数的相应 ...

  8. Java 自带MD5加密 Demo

    package demo; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; pub ...

  9. Java 关于密码处理的工具类[MD5编码][AES加密/解密]

    项目中又遇到了加密问题,又去翻了半天,然后做测试,干脆就把常用的两类小结一下. 1.第一种所谓的MD5加密 其实也不算加密,只是基于Hash算法的不可逆编码而已,等于说,一旦经过MD5处理,是不可能从 ...

随机推荐

  1. 用IKVMC将jar转成dll供c#调用

    用IKVMC将jar转成dll供c#调用 ikvmc c# dll jar 用IKVMC将jar转成dll供c#调用 前言 ikvmc介绍 ikvmc下载安装 下载并解压 设置环境变量 jar-> ...

  2. 理解inode

    转载:阮一峰 http://www.ruanyifeng.com/blog/2011/12/inode.html 一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最 ...

  3. Case When Exists SQL

    The Case-When-Exists expression in Oracle is really handy. Here's an example of how to use it in a s ...

  4. silverlight 退出系统(关闭当前网页),通过调用JS

    确认后直接退出系统,关闭当前页面 页面部分: <HyperlinkButton x:Name="LinkExit" Style="{StaticResource L ...

  5. Eruda——手机网页前端调试面板

    前言 进行移动端网页开发时,想要查看手机浏览器信息从来都不是一件容易的事.特别是当目标环境为APP内置WebView,需要调用特定的JsBridge接口时,你根本都干不了什么,只能一遍又一遍地修改代码 ...

  6. ASP.NET MVC5学习笔记之Action参数模型绑定值提供体系

    这一节我们关注模型绑定的值提供体系,先来介绍几个重要的接口 一. IValueProvider,接口定义如下: public interface IValueProvider { bool Conta ...

  7. devexpress 控制面板汉化方式 参考信息

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. 在WPF程序中将控件所呈现的内容保存成图像(转载)

    在WPF程序中将控件所呈现的内容保存成图像 转自:http://www.cnblogs.com/TianFang/archive/2012/10/07/2714140.html 有的时候,我们需要将控 ...

  9. .NET开源工作流RoadFlow-系统布署中常见错误及处理方法

    1.未开启asp.net状态服务时会出现以下错误: 解决办法:开启ASP.NET STATE SERVICE服务 2.未开启应用程序池32位: 解决办法:启用32位

  10. oracle 归档/非归档

    1.查看oralce是归档模式还是非归档模式 SQL> select name,log_mode from v$database; NAME LOG_MODE------------------ ...