文章目录
Java实现Base64加密
学习来源:
慕课网:https://www.imooc.com/learn/285
第1章 概述
1-1 密码的常用术语
- 密码常用术语(一)
明文:待加密信息。
密文:经过加密后的明文。
加密:明文转为密文的过程。
加密算法:明文转为密文的转换算法。
加密密钥:通过加密算法进行加密操作用的密钥。
解密:将密文转为明文的过程。
解密算法:密文转为明文的算法。
解密密钥:通过解密算法进行解密操作用的密钥。
密码分析:截获密文者试图通过分析截获的密文从而推断出原来的明文或密钥的过程。
主动攻击:攻击者非法入侵密码系统,采用伪造、修改、删除等手段向系统注入假消息进行欺骗。(对密文具有破坏作用)
被动攻击:对一个保密系统采取截获密文并对其进行分析和攻击。(对密文没有破坏作用)
密码体制:由明文空间、密文空间、密钥空间、加密算法和解密算法五部分构成。
密码协议:也称安全协议,指以密码学为基础的消息交换的通信协议,目的是在网络环境中提供安全的服务。
密码系统:指用于加密、解密的系统。
柯克霍夫原则
:数据的安全基于密钥而不是算法的保密。即系统的安全取决于密钥,对密钥保密,对算法公开。——现代密码学设计的基本原则
。
1-3 密码分类
-
时间
古典密码:以字符为基本加密单元。
现代密码:以信息块为基本加密单元。(多个字符) -
保密内容
名称 | 详细说明 | 应用领域 | 类别 |
---|---|---|---|
受限制算法 | 算法的保密性基于保持算法的秘密**(算法保密**) | 军事领域 | 古典密码 |
基于密钥算法 | 算法的保密性基于对密钥的保密(密钥保密) | 现代密码 |
- 密码体制
名称 | 别名 | 详细说明 |
---|---|---|
对称密码 | 单钥密码或私钥密码 | 指加密密钥与解密密钥相同 |
非对称密码 | 双钥密码或公钥密码 | 指加密密钥与解密密钥不同,密钥分公钥、私钥 |
对称密码算法 | 单钥密码算法或私钥密码算法 | 指应用于对称密码的加密、解密算法 |
非对称密码算法 | 双钥密码算法或公钥密码算法 | 指对应于非对称密码的加密、解密算法 |
-
明文处理方法
分组密码:指加密时将名为分成固定长度的组,用同一密钥和算法对每一块加密,输出也是固定长度的密文。多用于网络加密。(一次加密一组明文)
流密码:也称序列密码。指加密时每次加密一位或者一个字节明文。(一次加密一个明文)
1-3-1散列函数
作用:散列函数用来验证数据的完整性
特性:
- 长度不受限制
- 哈希值容易计算
- 散列运算过程不可逆
散列函数相关的算法:
- 消息摘要算法MD5等
- SHA—-安全散列算法
- MAC——消息认证码算法(MAC——苹果操作系统–同名)
1-3-2数字签名
作用:主要是针对以数字的形式存储的消息进行的处理
1-4 OSI与TCP/IP安全体系
1-4-1OSI安全体系
OSI(Open SystemInterconnection)开放式通信系统
网络通信:
- 7.应用层
- 6.表示层
- 5.会话层
- 4.传输层
- 3.网络层
- 2.数据链路层
- 1.物理层
网络通信安全机制:
- 加密机制
- 数字签名机制
- 访问控制机制
- 数据完整性机制
- 认证机制
- 业务流填充机制
- 路由控制机制
- 公正机制
网络通信安全服务:
- 认证(鉴别):在交互时,对接收方和发送方的身份和数据的来源进行验证;
- 访问控制服务:防止没有授权的用户非法访问;
- 数据保密性服务:防止数据传输时被泄露和篡改;
- 数据完整性服务:保证传输时,没有被改变原有内容;
- 抗否认性服务:防止双方否认自己的操作
1-4-2 TCP/IP安全体系
TCP/IP和OSI体系层级区别:
TCP/IP安全体系结构:每一层都有对应的安全处理方式
TCP/IP安全体系:
1-5 java安全组成、包及第三方扩展
Java安全组成
- JCA(Java Cryptography Architecture):加密体系结构
- 提供基本的加密框架,如:消息摘要,数字签名等;
- JCE(Java Cryptography Extension):加密扩展包
- 扩展提供了 加密算法/消息摘要/密钥管理功能
- DES、AES、RSA算法通过JCE提供
- JSSE(Java Secure Socket Extension):安全套接字扩展包
- JSSE提供基于SSL的加密功能,主要用于网络传输
- JAAS(Java Authentication and Authentication Service):鉴别与安全服务
- java平台的用户身份验证(权限等)
security.provider.1=sun.security.provider.Sun
security.provider.2=com.sun.net.ssl.internal.ssl.Provider
security.provider.3=com.sun.rsajca.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=org.bouncycastle.jce.provider.BouncyCastleProvider
使用JDK以外的(第三方)扩展包需要修改资源文件并增加相关的内容,这是使用JDK以外的扩展包的方式之一。
jar包位置:
\jre\lib\security\java.security
添加第三方加密方法:
- 在下方从11开始添加;
- Note: Providers can be dynamically registered instead by calls to either the addProvider or insertProviderAt method in the Security class.(硬编码方式)
相关java包、类
- java.security(源码可见)
- 消息摘要
- javax.crypto
- 安全消息摘要,消息认证(鉴别)码
- java.net.sll
- 安全套接字:网络传输相关的加解密;HttpsURLConnection、SSLContext
第三方java扩展
- Bouncy Castle(开源的)
- 两种支持方案(上方的两种添加方式都可以使用):1)配置;2)调用
- Commons Codec(开源的)
- Apache提供
- Base64、二进制、十六进制、字符集编码
- Url编码/解码
第2章 Base64算法实现
-
算法实现方式:
Jdk(无需jar包)
Commons Codec(需要jar包,与jdk版本一致,案例包:bcprov-jdk15on-149.jar)
Bouncy Castle(需要jar包,案例包:commons-codec-1.10.jar) -
maven依赖
- jdk不需要依赖,其他的两个依赖为:
<!--base64加密commonsCodes-->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.11</version>
</dependency>
<!--base64加密bouncyCastle-->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
<version>1.46</version>
</dependency>
2-1 实现Base64算法
jdk的base64加密,解密
/**
* jdk的base64加密,解密
* @throws IOException
*/
public static void jdkbase64() {
BASE64Encoder encoder =new BASE64Encoder();
String encode = encoder.encode(src.getBytes());//加密,为String
System.out.println("encode = " + encode);
BASE64Decoder decoder=new BASE64Decoder();
try {
System.out.println("decoder = "+new String(decoder.decodeBuffer(encode)));//解密.解密为数组
} catch (IOException e) {
e.printStackTrace();
}
}
运行结果:
encode = aGVsbG8gd29ybGQ=
decoder = hello world
commonsCode的base64加密,解密
/**
* commonsCodes的base64加密,解密
org.apache.commons.codec.binary.Base64
*/
public static void commonsCodesBase64() {
byte[] encodeBases = Base64.encodeBase64(src.getBytes());
System.out.println("encodeBases = " + new String(encodeBases));
byte[] decodeBase64 = Base64.decodeBase64(encodeBases);
System.out.println("decodeBase64= " + new String(decodeBase64));
}
运行结果:
encodeBases = aGVsbG8gd29ybGQ=
decodeBase64= hello world
bouncyCastle的base64加密,解密
/**
* bouncyCastle的base64加密,解密
org.bouncycastle.util.encoders.Base64
*/
public static void bouncyCastleBase64() {
byte[] encode = Base64.encode(src.getBytes());
System.out.println("new String(encode) = " + new String(encode));
byte[] decode = Base64.decode(encode);
System.out.println("decode = " + new String(decode));
}
运行结果:
new String(encode) = aGVsbG8gd29ybGQ=
decode = hello world
2-2 Base64算法应用场景
- 应用场景:e-mail、密钥、证书文件
- 定义:基于64个字符的编码算法
- 关于RFC 2045
- 衍生:Base16、Base32、Url Base64