Java中使用MD5与Base64进行加密

MD5

什么是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

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工具类对密码进行加密然后保存到数据库,实现密文保存密码的功能。

你可能感兴趣的:(Java,java,算法)