前言:工作中经常遇到将数据进行各种方式的加密,然后封装到一个自定义的实体类中作为参数进行传输数据。当然这是为了数据在传输过程中的安全保证,不被其他人轻易的就获取到原数据;
首先,加密解密的概念很简单明了,就是字面意思;加密就是对原来的明文的文件或数据按某种算法进行处理,成为一段不可读的代码,也称为密文;解密就是加密的反过程,将加密后不可读的代码转化成原来的数据;
除了加密解密的概念,还有就是因为加密算法有很多种,总体分为两类:对称加密和非对称加密以及散列算法,对称加密就是加密和解密的使用的密钥是相同的,非对称加密中加密和解密时使用的密钥是不同的,散列算法和前面两种就不太相同,它加密是不需要密钥的;
最常见的散列算法就是MD5
和SHA1
,简单介绍一下MD5吧,因为最近也经常用到。
MD5算法是一种哈希函数,就一段信息对应一个哈希值,并且不能通过哈希值推出这段信息,而且还需要保证不存在任意两段不相同的信息对应同一个哈希值。MD5用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
广泛用于加密和解密技术,常用于文件校验。不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验;输入任意长度的信息,经过处理,输出都为128位的信息(数字指纹);
MD5是不可逆的,意思就是它其实没有解密方法的,只能进行加密处理;因为它在hash算法的计算过程中原文的部分信息是丢失了的
这里有篇MD5的详解如果想深入了解的可以看看这篇文章:https://blog.csdn.net/goodnameused/article/details/81068697
它的使用方法和md5是相同的,和MD5同样使用的使用hash函数,主要适用于数据子签名标准里面定义的数字签名算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段更小的密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要)的过程。
DES 加密算法是一种 分组密码,以 64 位为 分组对数据 加密,它的 密钥长度 是 56 位,加密解密 用 同一算法。
DES 加密算法是对 密钥 进行保密,而 公开算法,包括加密和解密算法。这样,只有掌握了和发送方 相同密钥 的人才能解读由 DES加密算法加密的密文数据。因此,破译 DES 加密算法实际上就是 搜索密钥的编码。对于 56 位长度的 密钥 来说,如果用 穷举法 来进行搜索的话,其运算次数为 2 ^ 56 次。
AES 加密算法是密码学中的 高级加密标准,该加密算法采用 对称分组密码体制,密钥长度的最少支持为 128 位、 192 位、256 位,分组长度 128 位,算法应易于各种硬件和软件实现。这种加密算法是美国联邦政府采用的 区块加密标准。
AES 本身就是为了取代 DES 的,AES 具有更好的 安全性、效率 和 灵活性。
RSA
加密算法是目前最有影响力的 公钥加密算法,并且被普遍认为是目前 最优秀的公钥方案 之一。RSA
是第一个能同时用于 加密 和 数字签名 的算法,它能够 抵抗 到目前为止已知的 所有密码攻击,已被 ISO
推荐为公钥数据加密标准。
RSA算法基于一个十分简单的数论事实:将两个大 素数 相乘十分容易,但想要对其乘积进行 因式分解 却极其困难,因此可以将 乘积 公开作为 加密密钥。
更多算法介绍强烈推荐:https://blog.csdn.net/baidu_22254181/article/details/82594072
下面就直接介绍一下怎么使用吧,毕竟加密解密在工作中一般都是封装好了的,其实最开始简单了解,然后知道怎么用就可以了;
Java已经实现了MD5、SHA1算法。利用java.security.MessageDigest类就可以获取字符串和文件的MD5以及SHA1结果。
最简单的使用方法:
Tools工具类:
import org.apache.commons.codec.digest.DigestUtils;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Tools {
/**
* md5简单使用实现
* @param str
* @return
*/
public static String getMD5String(String str) {
try {
// 生成一个MD5加密计算摘要(如果想使用sha1算法,可以替换成"SHA1")
MessageDigest md = MessageDigest.getInstance("MD5");
// 计算md5函数
md.update(str.getBytes());
// digest()最后确定返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
// BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
//一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方)
return new BigInteger(1, md.digest()).toString(16);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* MD5算法加密 (公司使用)
* @param source
* @return
*/
public static String MD5(String source) {
System.out.println(source);
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(source.getBytes());
byte[] b = md.digest();
StringBuffer sb = new StringBuffer();
for (byte c : b) {
int val = ((int) c) & 0xff;
if (val < 16)
sb.append("0");
sb.append(Integer.toHexString(val));
}
return sb.toString().toUpperCase();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
/**
* MD5算法加盐 (更复杂加密方式)
* @param source
* @return
*/
private static final String MD5KEY = "fadsjlfjeohkdfgjlk423211";
/**
* MD5验证方法
* @param text 明文
* @return 密文
*/
public static String MD5encrypt(String text){
//加密后的字符串
String encodeStr = DigestUtils.md5Hex(text + MD5KEY);
return encodeStr;
}
/**
* MD5验证方法
* @param text 明文
* @param md5 密文
* @return true/false
*/
public static boolean verify(String text, String md5){
//根据传入的密钥进行验证
String md5Text = MD5encrypt(text);
if (md5Text.equalsIgnoreCase(md5)){
return true;
}
return false;
}
}
测试类:
package com.leejie.md5Test;
import com.leejie.utils.Tools;
public class MD5Test {
private static final String pwd = "aabbcc";
public static void main(String[] args) throws Exception {
//简单加密
System.out.println(Tools.MD5(pwd));
//复杂加密
String md5Pwd = Tools.MD5encrypt("aabbcc");
System.out.println("aabbcc通过密钥加密之后的密文:"+md5Pwd);
//项目中使用md5做登录密码验证,加密的密码都是从数据库中取来,和登录输入的密码(密码在验证方法中进行相同的加密)进行对比
//验证密码是否正确
boolean result = Tools.verify("aabbcc", md5Pwd);
System.out.println("验证结果:"+result);
}
}
输出:
aabbcc
61A60170273E74A5BE90355FFE8E86AD
aabbcc通过密钥加密之后的密文:fccde86bc3bf351614d27baa5eff75ba
验证结果:true
更详细经典的文章推荐:
https://blog.csdn.net/qq_30683329/article/details/80879058
https://www.cnblogs.com/gaoqing/p/3678039.html
https://blog.csdn.net/u012611878/article/details/54000607
就这样吧,主要是介绍一下md5加密的使用,在平时传输数据或者存储密码时能够会使用就好了,更复杂的非对称加密先了解,等着后面在慢慢详细学习。不早了,明天继续加油!!
下一篇:sync异步的使用