Base64编码、AES加密、RSA加密、MD5加密
一、Base64编码
1.1、base64编码的概念
Base64 是一种编码方式,而不是加密手段。它的主要目的是将数据转换成特定格式,以便在网络传输或存储时使用。其核心原理是将二进制数据按 6 位一组进行切分,然后映射为可打印字符,从而生成安全、可读的字符串。
1.2、base64编码过程
我们拿helloword进行base64编码为例
1.2.1、将helloword通过ASCII表找到对应的十进制数
我们通过ASCII表可以找到helloword对应的十进制数分别是104,101,108,108,111,119,111,114,100
1.2.2、将helloword对应的十进制数转换成二进制数
二进制只有 0 和 1 两个数字。转换方法就是不断除以 2 取余数,然后把余数倒过来排列。通常为 8 位,也就是1个字节,不够补 0。
我们拿104为例,
104 ÷ 2 = 52,余数 0
52 ÷ 2 = 26,余数 0
26 ÷ 2 = 13,余数 0
13 ÷ 2 = 6,余数 1
6 ÷ 2 = 3,余数 0
3 ÷ 2 = 1,余数 1
1 ÷ 2 = 0,余数 1
把余数倒过来写:104 → 01101000
按照上面的计算方法,104,101,108,108,111,119,111,114,100转化成二进制数后分别为
01101000,01100101,01101100,01101100,01101111,01110111,01101111,01110010,01100100
1.2.3、将上面的二进制流每6位切分
Base64 中的“6”表示每个输出字符对应 6 位二进制,所以将上面的二进制流每6位切分:
011010 000110 010101 101100 011011 000110 111101 110111 011011 110111 001001 100100
1.2.4、将每组 6 位二进制转换为十进制
将上面的每6位二进制数转化成对应的十进制数:
26 6 21 44 27 6 61 55 27 55 9 36
1.2.5、查 Base64 码表
通过查上面的base64码表我们可以得到26 6 21 44 27 6 61 55 27 55 9 36这几个十进制数对应的字符:aGVsbG93b3Jk
以上就是helloword通过base64编码的全过程
1.3、使用java代码实现编码和解码
package cn.itcast.base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;public class Test3 {private static final String UTF8=StandardCharsets.UTF_8.name();public static void main(String[] args) throws Exception {String str="赚大钱,拿高薪";//使用jdk8自带的方法进行编码String encodeStr = Base64.getEncoder().encodeToString(str.getBytes(UTF8));System.out.println("encodeStr = " + encodeStr);//使用jdk8自带的方法进行解码byte[] decode = Base64.getDecoder().decode(encodeStr.getBytes(UTF8));System.out.println("decodeStr = " + new String(decode,UTF8));}}
1.4、总结:
1、原始数据 → 字节流
字符串每个字符先转成 ASCII(或 UTF-8)对应的字节
2、字节流 → 二进制流
每个字节 8 位,拼成一条连续的二进制串。
3、二进制流 → 每 6 位切分
按 6 位一组切分,得到 0~63 的二进制块。
4、6 位二进制 → 十进制索引
每 6 位二进制转十进制,得到 0~63 的索引值。
例如:011010
→ 26
5、查 Base64 码表 → 对应字符
用步骤 4 得到的十进制索引去查 Base64 表
6、Base64编码名字的由来:由Base64码表中64个字符构成的字符串
二、MD5加密、SHA-256加密、SHA-512加密
2.1、MD5加密、SHA-256加密、SHA-512加密的特点
在信息安全中,常见的三种哈希算法分别是 MD5、SHA-256、SHA-512,他们都是不可逆的,即不能通过加密后的结果反推出原始值,哈希算法又称为摘要算法,他们三个的特点如下:
MD5:
生成的字符串长度:128 位(32 位十六进制字符串)
特点:速度快,但已被证明存在漏洞
适用:文件校验,不适合安全加密
SHA-256:
生成的字符串长度:256 位(64 位十六进制字符串)
特点:安全性高,性能与安全性平衡
适用:区块链、数字签名、密码存储
SHA-512:
生成的字符串长度:512 位(128 位十六进制字符串)
特点:安全性更强,摘要更长
适用:金融、军事等高安全需求场景
2.2、MD5加密、SHA-256加密、SHA-512加密在java中的使用
package cn.itcast.md5;
import org.junit.Test;import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;public class Test3 {private static final String UTF8=StandardCharsets.UTF_8.name();private static final String encryMehod="MD5";private static final String encryMehodSha256="SHA-256";private static final String encryMehodSha512="SHA-512";public static void main(String[] args) throws Exception {String str="赚大钱,拿高薪";//得到摘要算法对象MessageDigest md5 = MessageDigest.getInstance(encryMehod);//获取原始内容的字节数组byte[] bytes = str.getBytes(UTF8);//得到加密后的字节数组byte[] digest = md5.digest(bytes);//转换成base64编码后的字符串String digestStr = Base64.getEncoder().encodeToString(digest);//e5chhV0sUGv52v0ACRi7ow==System.out.println("digestStr:" + digestStr);}@Testpublic void test() throws NoSuchAlgorithmException, UnsupportedEncodingException {String str="赚大钱,拿高薪";//得到摘要算法对象MessageDigest md5 = MessageDigest.getInstance(encryMehodSha256);//获取原始内容的字节数组byte[] bytes = str.getBytes(UTF8);//得到加密后的字节数组byte[] digest = md5.digest(bytes);//转换成base64编码后的字符串String digestStr = Base64.getEncoder().encodeToString(digest);///9KkZoej9MOqqSM5Oys3yb7tjPvv0pRQMaTFBr7/3PY=System.out.println("digestStr:" + digestStr);}@Testpublic void test2() throws NoSuchAlgorithmException, UnsupportedEncodingException {String str="赚大钱,拿高薪";//得到摘要算法对象MessageDigest md5 = MessageDigest.getInstance(encryMehodSha512);//获取原始内容的字节数组byte[] bytes = str.getBytes(UTF8);//得到加密后的字节数组byte[] digest = md5.digest(bytes);//转换成base64编码后的字符串String digestStr = Base64.getEncoder().encodeToString(digest);///66In1HuSrsSPoMIG6lZpYlZc6s9U2Cyebqb3V4gkyRLgP7H9GXvA6GCZ7ybL1+TXrWkAlsfLVq72sRTNJ2pBQA==System.out.println("digestStr:" + digestStr);}}
三、对称加密
3.1、对称加密的特点
对称加密使用同一密钥加解密,速度快但密钥需保密,而 AES 是一种安全性高、效率快、密钥长度可选 128/192/256 位、广泛应用的对称加密算法。
3.2、java代码实现AES加解密
package cn.itcast.encry;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;public class Test3 {private static final String ALGORITHM="AES";private static final String key="123456789avbkjui";public static void main(String[] args) throws Exception {String text="我是需要被加密的字符串";//使用java自带的cipher对象,并且指定加密方式为AES对称加密Cipher cipher = Cipher.getInstance(ALGORITHM);//创建加解密的规则SecretKey secretKey=new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8),ALGORITHM);//选择加密还是解密模式,此时选择加密模式cipher.init(Cipher.ENCRYPT_MODE,secretKey);//将所需要的字符串进行加密,得到字节数组byte[] bytes = cipher.doFinal(text.getBytes(StandardCharsets.UTF_8));//将字节数组进行base64编码得到可视化的字符串String result = Base64.getEncoder().encodeToString(bytes);System.out.println("AES对称加密后进行base64编码后的结果:" + result);String dencry = dencry(result);System.out.println("AES对称解密后的结果:" + dencry);}public static String dencry(String text) throws Exception {//使用java自带的cipher对象,并且指定解密方式为AES对称解密Cipher cipher = Cipher.getInstance(ALGORITHM);//创建加解密的规则SecretKey secretKey=new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8),ALGORITHM);//选择加密还是解密模式,此时选择解密模式cipher.init(Cipher.DECRYPT_MODE,secretKey);//首先将经过base64编码后的字符串解码为字节数组,再将字节数组进行解密byte[] decode = Base64.getDecoder().decode(text);byte[] bytes = cipher.doFinal(decode);//将字节数组转化成正常字符串return new String(bytes,StandardCharsets.UTF_8);}}