慕课课程《Java实现Base64加密》学习笔记
打字越来越溜~
密码常用术语
明文:待加密信息。
密文:经过加密后的明文。
加密:明文转为密文的过程。
加密算法:明文转为密文的转换算法。
加密密钥:通过加密算法进行加密操作用的密钥。
解密:将密文转为明文的过程。
解密算法:密文转为明文的算法。
解密密钥:通过解密算法进行解密操作用的密钥。
密码分析:截获密文者试图通过分析截获的密文从而推断出原来的密文或密钥的过程。
主动攻击:攻击者非法入侵密码系统,采用伪造、修改、删除等手段向系统注入假消息进行欺骗。(对密文具有破坏作用)
被动攻击:对一个保密系统采取截获密文并对其进行分析和攻击。(对密文没有破坏作用)
密码体制:由明文空间、密文空间、密钥空间、加密算法和解密算法五部分构成。
密码协议:也称安全协议,指以密码学为基础的消息交换的通信协议,目的是在网络环境中提供安全的服务。
密码系统:指用于加密、解密的系统。
柯克霍夫原则:数据的安全基于密钥而不是算法的保密。即系统的安全取决于密钥,对密钥保密,对算法公开。——现代密码学设计的基本原则。
密码分类
按时间
古典密码:以字符为基本加密单元。
现代密码:以信息块为基本加密单元。
按保密内容算法
名称 | 详细说明 | 应用领域 | 类别 |
---|---|---|---|
受限制算法 | 算法的保密性基于保护算法的秘密 | 军事领域 | 古典密码 |
基于密钥算法 | 算法的保密性基于对密钥的保密 | 现代密码 |
按密码体制
名称 | 别名 | 详细说明 |
---|---|---|
对称密码 | 单钥密码或私钥密码 | 指加密密钥与解密密钥相同 |
非对称密码 | 双钥密码或公钥密码 | 指加密密钥与解密密钥不同,密钥分公钥、私钥 |
对称密码算法 | 单钥密码算法或私钥密码算法 | 指应用于对称密码的加密、解密算法 |
非对称密码算法 | 双钥密码算法或公钥密码算法 | 指对应于非对称密码的加密、解密算法 |
按明文处理方法
分组加密:指加密时将明文分成固定长度的组,用同一密钥和算法对每一块加密,输出也是固定长度的密文。多用于网络加密。
流密码:也称序列密码。指加密时每次加密一位或者一个字节明文。
散列函数
用来验证数据的完整性
特点:长度不受限制、哈希值容易计算、散列运算过程不可逆
相关算法:消息摘要算法MD5等、SHA——安全散列算法、MAC ——消息认证码算法
数字签名
主要是针对以数字的形式存储的消息进行的处理
OSI安全体系
OSI(Open System Interconnection)
TCP/IP安全体系
Java安全组成
JCA
(Java Cryptography Architecture)
提供基本的加密框架,比如消息摘要、数字签名等
JCE
(Java Cryptography Extension)
在JCA
基础上做了一些扩展,提供了很多加密的算法、消息摘要和密钥管理等一些功能,比如DES、AES、RSA算法通过JCE提供
JSSE
(Java Secure Socket Extension)
提供基于SSL
的加密功能,主要用于网络传输
JAAS
(Java Authentication and Authentication Service)
提供Java平台上进行用户身份验证功能
使用JDK以外的扩展包需要修改资源文件并增加相关的内容,这是使用JDK以外的扩展包的方式之一。在\jdk1.8.0_191\jre\lib\security的java.security文件中可查看
例:security.provider.1=sun.security.provider.Sun
security.provider.2=com.sun.net.ssl.internal.ssl.Provider
相关Java包、类
java.security
—消息摘要
javax.crypto
—安全消息摘要,消息认证(鉴别)码
java.net.ssl
—安全套接字
第三方扩展
Bouncy Castle
—两种支持方案:1)配置;2)调用
Commons Codec
—Apache
—Base64、二进制、十六进制、字符集编码
—URL编码/解码
Base64算法
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;
public class Base64 {
private static String str = "imooc security base64";
public static void main(String[] args){
jdkBase64();
commonsCodesBase64();
bouncyCastleBase64();
}
public static void jdkBase64() {
try {
BASE64Encoder encoder = new BASE64Encoder();
String encode = encoder.encode(str.getBytes());
System.out.println("encode:"+encode);
BASE64Decoder decoder = new BASE64Decoder();
System.out.println("decode:"+new String(decoder.decodeBuffer(encode)));
}catch (IOException e){
e.printStackTrace();
}
}
public static void commonsCodesBase64(){
byte[] encodeBytes = org.apache.commons.codec.binary.Base64.encodeBase64(str.getBytes());
System.out.println("encode:"+encodeBytes);
byte[] decodeBytes = org.apache.commons.codec.binary.Base64.decodeBase64(encodeBytes);
System.out.println("decode:"+new String(decodeBytes));
}
public static void bouncyCastleBase64(){
byte[] encodeBytes = org.bouncycastle.util.encoders.Base64.encode(str.getBytes());
System.out.println("encode:"+new String(encodeBytes));
byte[] decodeBytes = org.bouncycastle.util.encoders.Base64.decode(encodeBytes);
System.out.println("decode:"+new String(decodeBytes));
}
}
运行结果:
encode:aW1vb2Mgc2VjdXJpdHkgYmFzZTY0
decode:imooc security base64
encode:[B@1d44bcfa //很奇怪?为什么不一样呢
decode:imooc security base64
encode:aW1vb2Mgc2VjdXJpdHkgYmFzZTY0
decode:imooc security base64
复制代码
应用场景:e-mail、密钥、证书文件
产生:邮件是“历史问题”
定义:基于64个字符的编码算法
关于RFC 2045
衍生:Base16、Base32、Url Base64
Base64算法与加解密算法
MD5
1
import org.apache.tomcat.util.security.MD5Encoder;
//将密码加密
public String EncodeByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException {
//确定计算方法
MessageDigest md5 = MessageDigest.getInstance("MD5");
BASE64Encoder base64Encoder = new BASE64Encoder();
//加密字符串
String newstr = base64Encoder.encode(md5.digest(str.getBytes("utf-8")));
return newstr;
}
复制代码
2
import org.springframework.util.DigestUtils;
//md5盐值字符串,用于混淆MD5
private final String slat = "sdcbbdguyg^&^$%^*GSQGSI!US*&wd?dwJHW@^^&g";
private String getMD5(long seckillId){
String base = seckillId + "/" + slat;
String md5 = DigestUtils.md5DigestAsHex(base.getBytes());
return md5;
}
复制代码