转自:慕课网
1、 密码常用术语
明文:待加密信息
密文:经过加密后的明文
加密:明文转为密文的过程
加密算法:明文转为密文的转换算法
加密密钥:通过加密算法进行加密操作的密钥
解密:将密文转为明文的过程
解密算法:密文转为明文的算法。
解密密钥:通过解密算法进行解密操作的密钥
密码分析:截获密文者试图通过分析截获的密文从而推断出原来的明文或密钥的过程。
主动攻击:攻击者非法入侵密码系统,采用伪造、修改、删除等手段向系统注入假消息进行欺骗。(对密文具有破坏作用)
被动攻击:对一个保密系统采取截获密文并对其进行分析和攻击。(对密文没有破坏作用)
密码体制:由明文空间、密文空间、密钥空间、加密算法和解密算法五部分构成。
密码协议:也称安全协议,指以密码学为基础的消息交换的通信协议,目的是在网络环境中提供安全的服务。
密码系统:指用于加密、解密的系统。
柯克霍夫原则:数据的安全基于密钥而不是算法的保密。即系统的安全取决于密钥,对密码保密,对算法公开。--现代密码学设计的基本原则。
2、密码分类:
按时间分:古典密码-以字符为基本加密单元
现代密码-以信息块为基本加密单元
按保密内容算法分:
受限制的算法:算法的保密性基于保持算法的保密。应用于军事领域,属于古典密码。
基于密钥的算法:算法的保密性基于对密钥的保密。属于现代密码。
按密码体制分:
对称密码:单钥密码或私钥密码。指加密密钥与解密密钥相同。
非对称密码:双钥密码或公钥密码。指加密密钥与解密密钥不同,密钥分公钥、私钥。
对称密码算法:单钥密码算法或私钥密码算法。指应用于对称密码的加密、解密算法。
非对称密码算法:双钥密码算法或公钥密码算法,指对应于非对称密码的加密、解密算法。
按明文处理方法分:
分组密码:加密时将明文分成固定长度的组,用同一密钥和算法对每一块加密,输出也是固定长度的密文。多用于网络加密。
流密码:也称序列密码。指加密时每次加密一位或者一个字节明文。
哈希函数(散列函数):用来验证数据的完整性。长度不受限制,哈希值容易计算,散列运算过程不可逆。比如:消息摘要算法MD5等、SHA—安全散列算法、MAC—消息认证码算法、数字签名(主要是针对以数字的形式存储的消息进行的处理)
3、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)提供权限安全
使用JDK以外的扩展包需要修改资源文件并增加相关内容,这个使用JDK以外的扩展包的方式之一。
security.provider.1=sun.security.provider.Sun
详见:jre\lib\security中的java.security
最近遇到一个于此相关的问题,感谢昆仑山神的博文,解决 javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair
4、相关java包、类
java.security --消息摘要
javax.crypto --安全消息认证,消息认证(鉴别)码
java.net.ssl --安全套接字,基于网络的,如HttpsURLConnection、SSLContext
5、第三方Java扩展
Bouncy Castle(BC)
--两种支持方案:1)配置;2)调用
Commons Codec
--Apache
--Base64、二进制、十六进制、字符集编码
--Url编码/解码
6、实现Base64算法
算法实现
--jdk
--Commons Codec
--Bouncy Castle
应用场景:e-mail、密钥、证书文件。相关代码如下:
package com.lijy.base64;
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;
/**
* @author Lijingyu on 2017/8/2.
*/
public class TestBase64 {
private static String src = "原始加密数据";
public static void main(String[] args) {
// jdkBase64();
// commonsCodesBase64();
bouncyCastleBase64();
}
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();
}
}
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));
}
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));
}
}
衍生:Base16、Base32、Url Base64
Base64算法与加解密算法(替换的方式实现的算法)