什么是MD5:MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。(注意MD5只能加密不能解密!)
Base64是一种能将任意二进制数据用64种字元组合成字串的方法,而这个二进制数据和字串数据彼此之间是可以互相转换的,十分方便。在实际应用上,Base64除了能将二进制数据可视化之外,也常用来表示字串加密过后的内容。
Base 64主要用途不是加密,而是把一些二进制数转成普通字符,方便在网络上传输。 由于一些二进制字符在传输协议中属于控制字符,不能直接传送,所以需要转换一下才可以。由于某些系统中只能使用ASCII字符,Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法,Base64特别适合在http,mime协议下快速传输数据。比如网络中图片的传输。Base64,并非安全领域下的加密解密算法。虽然经常遇到所谓的base64的加密解密。但base64只能算是一个编码算法,对数据内容进行编码来适合传输。虽然base64编码过后原文也变成不能看到的字符格式,但是方式初级又简单。 (base64可以进行编码也可以进行解码)
通常我们在保存用户密码这类信息时,需要使用密文存储,下面我们就简单实现一下使用MD5和base64进行加密。
MD5可以使用Java自带的MessageDigest,也可以使用Spring自带的工具类DigestUtils。
package com.openlab.test;
import org.springframework.util.DigestUtils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Base64;
public class SecurityTest {
public static void main(String[] args) throws NoSuchAlgorithmException {
/**
* MD5可以使用Java自带的MessageDigest,
* 也可以使用Spring自带的工具类DigestUtils
*/
//假设为用户输入的密码
String inputPassword = "admin12345";
//1.Java自带的MessageDigest
//获取后的摘要二进制数据
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] digest = md5.digest(inputPassword.getBytes());
System.out.println("Java自带的工具类内容为"+ Arrays.toString(digest));
//2.spring自带的工具类
//获取后的摘要二进制数据
byte[] bytes = DigestUtils.md5Digest(inputPassword.getBytes());
System.out.println("spring工具类获取内容为:"+Arrays.toString(bytes));
//直接通过二进制数组创建字符串看看效果
String s = new String(digest);
System.out.println("直接通过摘要数据创建的字符串:"+s);
//结果为t��1��NW��?���]所以这里使用base64进行编码
//获取编码器
Base64.Encoder encoder = Base64.getEncoder();
//获取编码的摘要二进制数据
byte[] encode = encoder.encode(digest);
System.out.println("使用base64编码后的二进制数据"+Arrays.toString(encode));
//通过编码后的二进制数据构建字符串
String s1 = new String(encode);
System.out.println("编码后的二进制数据构建的字符串:"+s1);
//最后的==是固定格式
}
}
测试结果
Java自带的工具类内容为[116, -120, -29, 49, -72, -74, 78, 87, -108, -38, 63, -92, -21, 16, -83, 93]
spring工具类获取内容为:[116, -120, -29, 49, -72, -74, 78, 87, -108, -38, 63, -92, -21, 16, -83, 93]
直接通过摘要数据创建的字符串:t��1��NW��?���]
使用base64编码后的二进制数据[100, 73, 106, 106, 77, 98, 105, 50, 84, 108, 101, 85, 50, 106, 43, 107, 54, 120, 67, 116, 88, 81, 61, 61]
编码后的二进制数据构建的字符串:dIjjMbi2TleU2j+k6xCtXQ==
Process finished with exit code 0
因此我们就将原密码 “admin12345” 加密成了 “dIjjMbi2TleU2j+k6xCtXQ==”,
最后的 “==” 是固定格式,保存的时候将他截取调即可,因此当我们从前端获取到用户数据时,可以通过MD5工具类对密码进行加密然后保存到数据库,实现密文保存密码的功能。