一.常用术语
1.明文:没有进行加密,能够直接代表原文含义的信息。
2.密文:经过加密处理处理之后,隐藏原文含义的信息。
3.加密:将明文转换成密文的实施过程。
4.解密:将密文转换成明文的实施过程。
5.加密密钥:通过加密算法进行加密操作时用的秘钥。
6.解密密钥:通过解密算法进行解密操作时用的秘钥。
7.加密算法:将明文转为密文的转换算法。
8.解密算法:将密文转为明文的转换算法。
9.密码分析:截获密文者视图通过分析截获的密文从而推断出原来的明文或秘钥的过程。
10.主动攻击:攻击者非法入侵密码系统,采用伪造,修改,删除的手段向系统注入假消息进行欺骗。(对密文具有破坏性)
11.被动攻击:对一个保密系统采取截获密文并对其进行分析。(对密文不具有破坏性)
12.密码系统:由明文空间,密文空间,密钥空间,加密算法和解密算法五个部分组成。
13.密码协议:安全协议是以密码学为基础的消息交换协议,其目的是在网络环境中提供各种安全服务。
15.柯克霍夫原则:数据的安全基于密钥而不是算法的保密。即数据的安全取决于密钥,对密钥保密,对算法公开。这样有利于算法的完善。
二.密码分类
1.根据时间
(1).古典密码:以字符为基本的加密单元。
(2).现代密码:以信息块(多个字符组成一个信息块)为基本的加密单元。
2.根据保密内容
(1).受限制算法:保密性基于加解密的算法的保密。常用语军事领域。
(2).基于密钥算法:保密性基于密钥的保密,算法公开,密钥保密(基于柯克霍夫原则)
3.根据体制
(1).对称加密:加密密钥与解密秘钥相同。
(2).非对称加密:加密密钥与解密秘钥不相同,加密使用公钥,解密使用私钥。
三.Java的安全组成
1.JCA(Java Cryptography hArchitecture)
Java加密体系结构,提供基本的加密框架,如消息摘要、数组签名。
2.JCE(Java Cryptography Extension)
Java加密扩展包,它们提供用于加密、密钥生成和协商以及 Message Authentication Code(MAC)算法的框架和实现。是对JCA的扩展,提供更多的加密算法,密钥管理的功能(如DES、AES、RSA等算法)
3.JSSE(Java Secure Socket Extension )
Java Socket 的扩展包,基于SSL的加密功能。主要用于网络传输。
SSL(Secure Sockets Layer)是JSSE中的重要的部分。SSL是用的最广泛的实现网络的加密协议。SSL用一个密码处理来提供网络安全通信。SSL是基于标准的TCP/IP socket协议的安全增加用于网络通信,所以SSL是位于传输层和应用程序层之间。最普通的使用SSL的是HTTP(Hypertext Transfer Protocol),用于网络页面。
4.JAAS(Java Authentication Authorization Service)
Java验证和授权服务
四.JAVA安全实现的方式
1.JDK
java内置的加密主要由以下三个包及其子包组成:
(1)java.security
Java SDK 中与安全相关的类和接口都放在 java.security 包中,其中既包括访问控制配置及细粒度访问控制框架的实现,还包括签名和加解密的实现。
(2)javax.crypto
在此包中定义的 cryptographic 操作包括加密、密钥生成和密钥协商,以及消息验证代码 (MAC) 生成。
加密支持包括对称密码、不对称密码、块密码和流密码。此包还支持安全流和封装的对象。
此包中提供的许多类都是基于提供程序的。该类本身定义应用程序可以写入其中的编程接口。然后可由第三方供应商编写实现本身,并根据需要无缝嵌入。因此,应用程序开发人员可以利用任意数量的基于提供程序的实现,而无需添加或重写代码。
(3)javax.net.ssl
提供用于安全套接字包的类,例如HttpsURLConnection和SSLContext等。借助于安全套接字类,可以使用 SSL 或相关的安全协议进行通信,以便可靠地检测网络字节流中的任何错误,并且可以选择对数据进行加密和/或对通信同位体进行身份验证。
2.Bouncy Castle
(1).引入Bouncy Castle
①.通过配置的方式
第一步:把bcprov-jdk15on-1.58.jar文件复制到 %JAVA_HOME%/jre/lib/ext 目录下面,bcprov-jdk15on-1.58.jar可以到官网或者Maven工程下载
第二步:修改配置文件%Java_Home%/jre/lib/security/java.security,添加以下配置
//11表示序号为了不与JDK自带的配置冲突所以设置为11
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider
如下图:
第三步:测试
package test;
import java.security.Provider;
import java.security.Security;
public class Demo {
public static void main(String[] args) {
System.out.println("-------列出加密服务提供者-----");
Provider[] pro = Security.getProviders();
for (Provider p : pro) {
System.out.println("Provider:" + p.getName() + " - version:" + p.getVersion());
System.out.println(p.getInfo());
}
System.out.println("");
System.out.println("-------列出系统支持的消息摘要算法:");
for (String s : Security.getAlgorithms("MessageDigest")) {
System.out.println(s);
}
System.out.println("-------列出系统支持的生成公钥和私钥对的算法:");
for (String s : Security.getAlgorithms("KeyPairGenerator")) {
System.out.println(s);
}
}
}
测试结果看到了“列出加密服务提供者”中出现了Bouncy Castle相关的提供。而且“消息摘要算法”与“公钥和私钥对的算法”也更加多
②.通过调用Security类的addProvider或者insertProviderAt方法添加,参考配置文件%Java_Home%/jre/lib/security/java.security
3.Commons Codec
Commons Codec是Apache提供的包,是项目中用来处理常用的编码方法的工具类包,例如DES、SHA1、MD5、Base64,URL,Soundx等等。不仅是编码,也可用于解码。