1. Base64加密概述
听到加解密可能大家都会想到各种加密算法,其实加解密和我们的日常工作是紧密联系的,比如我们的邮件在发送的过程中,都会采用加密的方式去传输邮件的内容,Base64其实严格意义上不算一个加解密的算法,但是一般我们会将其作为一个初级的方式去使用,它最开始的衍生就是从邮件开始的。下面是维基百科对于base64的描述:
例如Man单词的base64计算结果为TWFu,详细原理如下:
在此示例中,Base64将3个字节编码为4个字符。
- Base64索引表
2. 密码术语
- 密码常用术语
明文:待加密信息
密文:经过加密后的明文
加密:明文转为密文的过程
加密算法:明文转为密文的转换算法
加密密钥:通过加密算法进行加密操作用的密钥
解密:将密文转为明文的过程
解密算法:密文转为明文的转换算法
解密密钥:通过解密算法进行解密操作用的密钥
密码分析:截获密文者试图通过分析截获的密文从而推出原来的明文或者密钥的过程
主动攻击:攻击者非法侵入密码系统,采用伪造、删除、修改等手段向系统注入假消息进行欺骗(对密文具有破坏作用)
被动攻击:对保密系统采取截获密文并对其进行分析和攻击(对密文没有破坏作用)
密码体制:由明文空间、密文空间、密钥空间、加密算法和解密算法五部分构成
密码协议:也称安全协议,指以密码学为基础的消息交换的通信协议,目的是在网络环境中提供安全的服务
密码系统:指用于加密、解密的系统
柯克霍夫原则:数据的安全基于密钥而不是密码的保密。即系统的安全取决于密钥,对密钥保密,对算法公开。--现代密码学 设计的基本原则
3. 密码的分类
按照时间分类:
古典密码:以字符为基本加密单位
现代密码:以信息块为基本加密单位
保密内容分类:
名称 | 详细说明 | 应用领域 | 类别 |
受限制算法 | 算法的保密性基于保护算法的秘密 | 军事领域 | 古典密码 |
基于密钥算法 | 算法的保密基于对密钥的保密 | 现代密码 |
密码体制分类:
名称 | 别名 | 详细说明 |
对称密码 | 单钥密码或私钥密码 | 指加密密钥和解密密钥相同 |
非对称密码 | 双钥密码或公钥密码 | 指加密密钥和解密密钥不同,密钥分公钥、私钥 |
对称密码算法 | 单钥密码算法或私钥密码算法 | 指应用于对称密码的加密、解密算法 |
非对称密码算法 | 双钥密码算法或公钥密码算法 | 指应用于非对称密码的加密、解密算法 |
明文处理方法分类:
分组密码:指加密时将明文分为固定长度的组,用同一密钥和算法对每一块加密,输出也是固定长度的密文。多用于网络加密。
流密码:也称序列密码,指加密时每次加密一位或者一个字节的明文
散列函数:
散列函数用来验证数据的完整性,散列函数的长度不受限制,哈希值容易计算,散列运算过程不可逆
数字签名:
是针对以数字形式存储的消息进行的处理。
4. Java实现Base64加密
- JDK对Base64的实现
package com.bity.base64;
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
* <p>Title: Base64</p >
* <p>Description: Base64实现 </p >
* <p>Company: http://www.agree.com</p >
* <p>Project: security</p >
*
* @author <a href="mailto:weiqi@agree.com.cn">WEIQI</a>
* @version 1.0
* @date 2022/4/25 15:41
*/
public class Base64Security {
private static final String src = "I'm base64 security info";
public static void main(String[] args) {
jdkBase64();
commonsCodesBase64();
bouncyCastleBase64();
}
/**
* JDK实现方式
*
* @author: <a href="mailto:weiqi@agree.com.cn">WEIQI</a>
* @date: 2022/4/25 15:59
*/
private static void jdkBase64() {
BASE64Encoder encoder = new BASE64Encoder();
String encode = encoder.encode(src.getBytes(StandardCharsets.UTF_8));
System.out.println("encode is : " + encode);
BASE64Decoder decoder = new BASE64Decoder();
try {
System.out.println("decoder is : " + new String(decoder.decodeBuffer(encode)));
} catch (IOException e) {
e.printStackTrace();
}
}
}
- commons-codec的实现方式
/**
* commons-codes的实现方式
*
* @author: <a href="mailto:weiqi@agree.com.cn">WEIQI</a>
* @date: 2022/4/25 16:02
*/
private static void commonsCodesBase64() {
byte[] encodeBytes = Base64.encodeBase64(src.getBytes(StandardCharsets.UTF_8));
System.out.println("encode is : " + new String(encodeBytes));
byte[] decodeBytes = Base64.decodeBase64(encodeBytes);
System.out.println("decode is : " + new String(decodeBytes));
}
- bouncy-castle的实现方式
/**
* bouncy-castle的实现方式
*
* @author: <a href="mailto:weiqi@agree.com.cn">WEIQI</a>
* @date: 2022/4/25 16:06
*/
private static void bouncyCastleBase64() {
byte[] encodeBytes = org.bouncycastle.util.encoders.Base64.encode(src.getBytes(StandardCharsets.UTF_8));
System.out.println("encode is : " + new String(encodeBytes));
byte[] decodeBytes = org.bouncycastle.util.encoders.Base64.decode(encodeBytes);
System.out.println("decode is : " + new String(decodeBytes));
}
5. 总结
Base64的一般应用场景为:e-mail、密钥、证书文件等,以上就是Base64的全部内容,实现比较简单,在实际工作中可以使用第三方包简化使用。
附加
关于加解密相关系列文章会在微信公众号《编程之艺术》中每天连载分享,感兴趣的朋友可以关注下,可以及时获取最新文章连载信息。