如基本的单向加密算法:

  • BASE64 严格地说,属于编码格式,而非加密算法
  • MD5(Message Digest algorithm 5,信息摘要算法)
  • SHA(Secure Hash Algorithm,安全散列算法)
  • HMAC(Hash Message Authentication Code,散列消息鉴别码)

复杂的对称加密(DES、PBE)、非对称加密算法:

  • DES(Data Encryption Standard,数据加密算法)
  • PBE(Password-based encryption,基于密码验证)
  • RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)
  • DH(Diffie-Hellman算法,密钥一致协议)
  • DSA(Digital Signature Algorithm,数字签名)
  • ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)

  本篇内容简要介绍BASE64、MD5、SHA、HMAC几种方法。 
 MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。 
BASE64

  按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。

通过java代码实现如下:

  1. /**
  2. * BASE64解密
  3. *
  4. * @param key
  5. * @return
  6. * @throws Exception
  7. */
  8. public static byte[] decryptBASE64(String key) throws Exception {
  9. return (new BASE64Decoder()).decodeBuffer(key);
  10. }
  11.  
  12. /**
  13. * BASE64加密
  14. *
  15. * @param key
  16. * @return
  17. * @throws Exception
  18. */
  19. public static String encryptBASE64(byte[] key) throws Exception {
  20. return (new BASE64Encoder()).encodeBuffer(key);
  21. }

主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。

MD5 
  MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。就是用来验证文件是否一致的。

通过java代码实现如下:

  1. /**
  2. * MD5加密
  3. *
  4. * @param data
  5. * @return
  6. * @throws Exception
  7. */
  8. public static byte[] encryptMD5(byte[] data) throws Exception {
  9.  
  10. MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
  11. md5.update(data);
  12.  
  13. return md5.digest();
  14.  
  15. }

通常我们不直接使用上述MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串。

SHA 
SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了, 但是SHA仍然是公认的安全加密算法,较之MD5更为安全。

通过java代码实现如下:

  1. /**
  2. * SHA加密
  3. *
  4. * @param data
  5. * @return
  6. * @throws Exception
  7. */
  8. public static byte[] encryptSHA(byte[] data) throws Exception {
  9.  
  10. MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
  11. sha.update(data);
  12.  
  13. return sha.digest();
  14.  
  15. }
  16. }

HMAC 
  HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。

通过java代码实现如下:

  1. /**
  2. * 初始化HMAC密钥
  3. *
  4. * @return
  5. * @throws Exception
  6. */
  7. public static String initMacKey() throws Exception {
  8. KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
  9.  
  10. SecretKey secretKey = keyGenerator.generateKey();
  11. return encryptBASE64(secretKey.getEncoded());
  12. }
  13.  
  14. /**
  15. * HMAC加密
  16. *
  17. * @param data
  18. * @param key
  19. * @return
  20. * @throws Exception
  21. */
  22. public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
  23.  
  24. SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
  25. Mac mac = Mac.getInstance(secretKey.getAlgorithm());
  26. mac.init(secretKey);
  27.  
  28. return mac.doFinal(data);
  29.  
  30. }

给出一个完整类,如下:

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

再给出一个测试类:

 BASE64Encoder和BASE64Decoder是非官方JDK实现类。虽然可以在JDK里能找到并使用,但是在API里查不到。JRE 中 sun 和 com.sun 开头包的类都是未被文档化的,他们属于 java, javax 类库的基础,其中的实现大多数与底层平台有关,一般来说是不推荐使用的。

BASE64的加密解密是双向的,可以求反解。 
    MD5、SHA以及HMAC是单向加密,任何数据加密后只会产生唯一的一个加密串,通常用来校验数据在传输过程中是否被修改。其中HMAC算法有一个密钥,增强了数据传输过程中的安全性,强化了算法外的不可控因素。

单向加密的用途主要是为了校验数据在传输过程中是否被修改。

java中几种加/解密API的更多相关文章

  1. Java中的AES加解密工具类:AESUtils

    本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...

  2. Java中的RSA加解密工具类:RSAUtils

    本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.utils.log.LogUtils; ...

  3. Java中的AES加解密

    直接上代码,Base64使用的是Java8的方法,如没有,替换即可 KEY:即密码 IV:即偏移量,可自订,十六位 加密方式:AES/CBC/PKCS5Padding,128位加密 如果想用256位和 ...

  4. C#与java中的AES加解密互解算法

    一.C#版AES加解密算法 public class AESCode { public string Key { get; set; } public string Encrypt(string va ...

  5. C# RSA加解密与验签,AES加解密,以及与JAVA平台的密文加解密

    前言: RSA算法是利用公钥与密钥对数据进行加密验证的一种算法.一般是拿私钥对数据进行签名,公钥发给友商,将数据及签名一同发给友商,友商利用公钥对签名进行验证.也可以使用公钥对数据加密,然后用私钥对数 ...

  6. java 与 c# 3des 加解密

    java 与 c# 3des 加解密   主要差异如下: 1.  对于待加密解密的数据,各自的填充模式不一样 C#的模式有:ANSIX923.ISO10126.None.PKCS7.Zero,而Jav ...

  7. Java中几种日志方案

    .本文记录Java中几种常用的日志解决方案 0x01 Log4j .这应该是一个比较老牌的日志方案了,配置也比较简单,步骤如下 1)添加对应依赖,比如 Gradle 中 dependencies { ...

  8. C# 中使用 RSA加解密算法

    一.什么是RSA RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制. 在公开密钥密码体制中,加密密钥(即 ...

  9. Java中23种经典设计模式详解

    Java中23种设计模式目录1. 设计模式 31.1 创建型模式 41.1.1 工厂方法 41.1.2 抽象工厂 61.1.3 建造者模式 101.1.4 单态模式 131.1.5 原型模式 151. ...

随机推荐

  1. handsontable合并表头

    想在页面中做类似excel的操作,发现handsontable符合要求. 然后发现这个文章 http://blog.csdn.net/wynan830/article/details/9054195 ...

  2. 使用 JS 输出螺旋矩阵

    关于螺旋矩阵 这是我曾经遇到过的面试题,在 LeetCode 上找到了题目的原型,难度中等.题目描述如下: 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中 ...

  3. Win7删除右键菜单中“图形属性”和“图形选项”

    完win7操作系统后,打完驱动在桌面右键会出现如下两个选项,平时没啥用又占用空间,那么如何删掉这两个选项呢? 操作步骤: 1.在运行中输入 regedit 确定打开注册表: 2.依次单击展开HKEY_ ...

  4. Linux(Ubuntu)使用日记------为程序添加桌面快捷方式

     我们Ubuntu中的所以的程序的快捷方式都放在了/usr/share/applications文件夹下,都是以.desktop结尾的文件.我们可以在这个文件夹下创建我们的快捷方式,然后复制到桌面即可 ...

  5. 上传图片,通过node服务器存储在指定目录

    最近做毕设,需要上传图片,因为在本地服务器运行,所以想着前端上传后,通过node服务器接收图片,存储在指定的目录下. 一.前端实现 1.前端的页面和上传图片是利用element-ui组件实现的,&qu ...

  6. Oracle外部表与SQLLDR

    两种方法建立外部表 在建表语句中把EXTERNAL_TABLE参数设定为SQLLDR: 从12C起,可以使用模式来运行SQLLDR: 在建表语句中把EXTERNAL_TABLE参数设定为SQLLDR: ...

  7. BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块

    题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 ...

  8. 洛谷P3719 REXP 题解

    题目 一道考验递归的题目,在面对这种字符串处理的题时,还是应该用递归这种比较好看懂而且比较简单写的算法. \(code\) ```c++ // luogu-judger-enable-o2 inclu ...

  9. <Android基础> (七)内容提供器

    第七章 内容提供器 7.1 内容提供器(Content Provider) 主要应用于在不同的应用程序之间实现数据共享功能.允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性. 7.2 ...

  10. Flink的高可用集群环境

    Flink的高可用集群环境 Flink简介 Flink核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布,数据通信以及容错机制等功能. 因现在主要Flink这一块做先关方面的学习, ...