标签: Java二三事
慕课网学习笔记
参考很详细的 Java加密算法
第1章 概述
本课的内容:
- 安全与密码
- 常用安全体系介绍
- 密码分类及java的安全组成
- JDK相关包及第三方扩展
- Base64算法介绍
如何学习
- 掌握用法
- 深入理解
- 不断实践
一些资源
- 维基百科:很多算法都有详细的介绍
密码常用术语
- 明文:待加密信息
- 密文:经过加密后的明文
- 加密:明文转为密文的过程
- 加密算法:明文转为密文的转换过程
- 加密密钥:通过加密算法进行加密操作用的密钥
- 解密:将密文转为明文的过程
- 解密算法:密文转为明文的算法
- 解密密钥:通过解密算法进行解密操作的密钥
- 密码分析:截获密文者试图通过分析截获的密文从而推断出原来的明文或密钥的过程
- 主动攻击:攻击者非法入侵密码系统,采用伪造、修改、删除等手段向系统注入假消息进行欺骗(对密文具有破坏作用)
- 被动攻击:对一个保密系统采取截获密文并对其进行分析和攻击。(对密文没有破坏作用)
- 密码体制:由明文空间、密文空间、密钥空间、加密算法和解密算法五部分构成。
- 密码协议:也称安全协议,指以密码学为基础的消息交换的通信协议,目的是在网络环境中提供安全的服务
- 密码系统:指用于加密、解密的系统
- 科克霍夫原则:数据的安全基于密钥而不是算法的保密。即系统的安全取决于密钥,对密钥保密,对算法公开。————现代密码学设计的基本原则
加解密基础
- 密码分类————时间
- 古典密码:以字符为基础加密单元
- 现代密码:以信息块为基本加密单元
- 密码分类————保密内容算法
名称 | 详细说明 | 应用领域 | 类别 |
---|---|---|---|
受限制算法 | 算法的保密性基于保持算法的秘密 | 军事领域 | 古典密码 |
基于密钥算法 | 算法的保密性基于对密钥的保密 | 现代密码 |
+ 密码分类————密码体制
名称 | 别名 | 详细说明 |
---|---|---|
对称密码 | 单钥密码或私钥密码 | 指加密密钥与解密密钥相同 |
非对称密码 | 双钥密码或公钥密码 | 指加密密钥与解密密钥不同,密钥分为公钥,私钥 |
对称密码算法 | 单钥算法或私钥算法 | 指应用于对称密码的加密、解密的算法 |
非对称密码算法 | 双钥密码或公钥密码算法 | 指对应于非对称密码的加密、解密算法 |
密码分类————明文处理方法
- 分组密码:指加密时将明文分成固定长度的组,用同一密钥和算法对每一块加密,输出也是固定长度的密文。多用于网络加密
- 流密码:也称序列密码。指加密时每次加密一位或一个字节
散列函数
- 主要用来验证数据的完整性
- 特点:长度不受限制,哈希值容易计算
- 散列运算过程不可逆
散列函数相关的算法
- 消息摘要算法MD5等
- SHA————安全散列算法
- MAC————消息认证码算法
数字签名
- 主要是针对以数字的形式存储的消息进行处理
OSI安全体系
java安全组成
- JCA(Java Cryptography Architecture)
- JCE(Java Cryptography Extension)
- JSSE(Java Secure Socket Extension)
- JAAS(Java Authentication and Authentication Service)
- 一些实现需要看JDK
相关java包、类
- java.security
- 消息摘要
- javax.crypto
- 安全消息摘要,消息认证(鉴别)码
- java.net.sll
- 安全套接字
- java.security
- 第三方java扩展
- Bouncy Castle(开源的)
- Commons Codec(开源的)
第2章 Base64算法实现
- Base64加密
base64算法是基于64个字符的一种替换算法。base64加密的产生式电子邮件的“历史问题”——邮件只能传输ASCII码。base64加密的应用场景:email、密钥、证书文件。该算法可以由3种方式实现:JDK、Bouncy Castle、Commons Codec。
实现如下:
package base64;
import java.io.IOException;
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* 该类是Base64算法的实现
*/
public class JavaBase64 {
private static String src = "面向对象编程,object-oriented!@#*5"; // 需要加密的原始字符串
public static void main(String[] args) throws IOException {
System.out.println("原始字符串:\t\t\t" + src);
System.out.println();
jdkBase64();
System.out.println();
commonsCodecBase64();
System.out.println();
bouncyCastleBase64();
}
/** JDK实现Base64编码 */
public static void jdkBase64() throws IOException{
//如果这里没有出现sun的base64可以从Build Path中删除然后添加
BASE64Encoder encoder = new BASE64Encoder();
String encode = encoder.encode(src.getBytes());//编码
BASE64Decoder decoder = new BASE64Decoder();
String decode = new String(decoder.decodeBuffer(encode));//解码
System.out.println("JDK实现的base64编码:\t\t" + encode);
System.out.println("JDK实现的base64解码:\t\t" + decode);
}
/** Commons Codec实现base64编码 */
public static void commonsCodecBase64() {
byte[] encode = Base64.encodeBase64(src.getBytes());
byte[] decode = Base64.decodeBase64(encode);
System.out.println("Commons Codec实现base64编码:\t" + new String(encode));
System.out.println("Commons Codec实现base64解码:\t" + new String(decode));
}
/**Bouncy Castle实现base64编码 */
public static void bouncyCastleBase64() {
byte[] encode = org.bouncycastle.util.encoders.Base64.encode(src.getBytes());
byte[] decode = org.bouncycastle.util.encoders.Base64.decode(encode);
System.out.println("Bouncy Castle实现base64编码:\t"+new String(encode));
System.out.println("Bouncy Castle实现base64解码:\t"+new String(decode));
}
}
运行结果: