一.密码常用术语
明文:待加密信息
密文:经过加密后的明文
加密:明文转为密文的过程
加密算法:明文转为密文的转换算法
加密密钥:通过加密算法进行加密操作用的密钥
解密:将密文转为明文的过程
解密算法:密文转为明文的算法
解密密钥:通过解密算法进行解密操作用的密钥
密码分析:截获密文者试图通过分析截获的密文从而推断出原来的明文或密钥的过程
主动攻击:攻击者非法入侵密码系统,采用伪造、修改、删除等手段向系统注入假消息进行欺骗。(对密文具有破坏作用)
被动攻击:对一个保密系统采取截获密文并对其进行分析和攻击。(对密文没有破坏作用)
密码体制:由明文空间、密文空间、密钥空间、加密算法和解密算法五部分构成
密码协议:也称安全协议,指以密码学为基础的消息交换的通信协议,目的是在网络环境中提供安全的服务
密码系统:指用于加密、解密的系统
柯克霍夫原则:数据的安全基于密钥而不是算法的保密。即系统的安全取决于密钥,对密钥保密,对算法公开。——现在密码学设计的基本原则。
二.密码分类
1.按时间分类:
古典密码:以字符为基本加密单元
现代密码:以信息块为基本加密单元
2.按保密内容算法分类:
受限制算法:算法的保密性基于保持算法的秘密,主要应用于军事领域,属于古典密码
基于密钥算法:算法的保密性基于对密钥的保密,属于现代密码
3.按密码体制分类:
对称密码:单钥密码或私钥密码,指加密密钥与解密密钥相同
非对称密码:双钥密码或公钥密码,指加密密钥与解密密钥不同,密钥分公钥、私钥
对称密码算法:单钥密码算法或私钥密码算法,指应用于对称密码的加密、解密算法
非对称密码算法:双钥密码算法或公钥密码算法,指对应于非对称密码的加密、解密算法
4.按明文处理方法:
分组密码:指加密时将要加密的内容分成固定长度的组,用同一密钥和算法对每一块加密,输出也是固定长度的密文。多用于网络加密。
流密码:也称序列密码。指加密时每次加密一位或者一个字节明文。
三.散列函数和数字签名
1.散列函数
用来验证数据的完整性。
特点:长度不受限制,哈希值容易计算,散列运算运程不可逆
散列函数相关的算法:
a.消息摘要算法MD5等
b.SHA——安全散列算法
c.MAC——消息认证码算法
2.数字签名
主要是针对以数字的形式存储的消息进行的处理。
四.OSI安全体系
OSI(Open System Interconnection开放式通信系统)
五.TCP/IP安全体系
六.java安全组成
1.JCA(Java Cryptography Architecture)
提供基本的加密框架,如消息摘要、数字签名
2.JCE(Java Cryptography Extension)
在JCA的基础上做了一些扩展,提供很多加密的算法,消息摘要、密钥管理的功能。如DES、AES、RSA算法通过JCE提供
3.JSSE(Java Secure Socket Extension)
提供基于SSL的加密功能,主要用于网络传输
4.JAAS(Java Authentication and Authentication Service)
提供了在JAVA平台上进行用户身份验证的功能
七.Java中如何使用第三方的加解密提供者
1.使用JDK以外的扩展包需要修改资源文件并增加相关的内容,这是使用JDK以外的扩展包的方式之一。
\jre\lib\security\java.security文件中有如下配置:
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
2.调用security的addProvider或insertProviderAt方法,把我们要用的Provider做为参数传入
八.Java相关安全的包、类
1.java.security
消息摘要
2.javax.crypto
安全消息摘要,消息认证(鉴别)码,这个为我们所有需要的加解密操作提供了接口和类,通过这个包里提供的类的操作,我们可以完整的实现一套加解密的算法及安全摘要的算法
3.java.net.ssl
安全套接字,常用类HttpsURLConnection、SSLContext
九.第三方java扩展
1.Bouncy Castle
两种支持方案:
a.配置
security.provider.1=sun.security.provider.Sun
b.调用
2.Commons codec
Apache的,能支持Base64、二进制、十六进制、字符集编码、Url编码/解码
十.实现Base64算法
package com.bijian.study;
import java.io.IOException;
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class BJBase64 {
private static String src = "bj security base64";
public static void main(String[] args) {
jdkBase64();
commonsCodesBase64();
bouncyCastleBase64();
}
//JDK Base64实现
public static void jdkBase64() {
try {
BASE64Encoder encoder = new BASE64Encoder();
String encode = encoder.encode(src.getBytes());
System.out.println("encode:" + encode);
BASE64Decoder decoder = new BASE64Decoder();
System.out.println("decode:" + new String(decoder.decodeBuffer(encode)));
}catch(IOException e) {
e.printStackTrace();
}
}
//Commons Codec Base64实现
public static void commonsCodesBase64() {
byte[] encodeBytes = Base64.encodeBase64(src.getBytes());
System.out.println("encode:" + new String(encodeBytes));
byte[] decodeBytes = Base64.decodeBase64(encodeBytes);
System.out.println("decode:" + new String(decodeBytes));
}
//Bouncy Castle Base64实现
public static void bouncyCastleBase64() {
byte[] encodeBytes = org.bouncycastle.util.encoders.Base64.encode(src.getBytes());
System.out.println("encode:" + new String(encodeBytes));
byte[] decodeBytes = org.bouncycastle.util.encoders.Base64.decode(encodeBytes);
System.out.println("decode:" + new String(decodeBytes));
}
}
应用场景:e-mail、密钥、证书文件。
产生背景:最开始邮件产生时,传输一些非ascii值在不同的网关、网络时会出现一些问题,所以就能传ascii的值,即产生BASE64的算法。
RFC 2045:是BASE64算法的规范。
衍生:Base16、Base32、Url Base64
Base64算法与加解密算法:Base64编码、解码方式可以充当加解密算法,但是因为它的算法的计算方式和表都是公开的,违反了柯克霍夫原则,很容易被破解掉。当然,也可以做一些方式,比如加一个short或在编码前参杂一些字符,做一下绕码,再BASE64会安全些。其实,BASE64就是用了一种替换的方式去实现的算法。
PS:解决eclipse中无法直接使用Base64Encoder的问题
使用Base64Encoder,却发现在Eclipse中无法找到该类,因为Base64Encoder并不属于JDK标准库范畴,但是又包含在了JDK中。
解决方法:在Eclipse导入%JAVA_HOME%\jre\lib目录下的rt.jar包即可。Project->Properties,选择Java Build Path设置项,再选择Libraries标签,Add External Jars添加%JAVA_HOME%\jre\lib\rt.jar就OK!