密码的常用术语:
(一)
明文:待加密信息
密文:经过加密后的明文
加密:明文转为密文的过程
加密算法:明文转为密文的转换算法
加密密钥:通过加密算法进行加密操作用的密钥
解密:将密文转为明文的过程
解密算法:密文转为明文的算法
解密密钥:通过解密算法进行解密操作用的密钥
注意:加密与解密一般是成对出现的,但是对于单项的加密(如MD5)是不存在解密过程的
(二)
密码分析:截获密文者试图通过分析截获的密文从而推断出原来的明文或密钥的过程
主动攻击:攻击者非法侵入密码系统,采用伪造,修改,删除等手段向系统注入假消息进行欺骗。(对密文具有破坏作用)
被动攻击:对一个密保系统采取截获密文并对其进行分析和攻击。(对密文没有破坏作用)
密码体制:由明文空间,密文空间,密钥空间,加密算法,解密算法五部分构成
(三)
密码协议:也称安全协议,指以密码学为基础的消息交换的通信协议,目的是在网络环境中提供安全的服务。
密码系统:指用于加密,解密的系统
柯克霍夫原则:数据的安全基于密钥而不是算法的保密。即系统的安全取决于密钥,对密钥保密,对算法公开。---现代密码学设计的基本原则
密码的分类:
(一)以时间分类
古典密码:以字符为基本加密单元
现代密码:以信息块(多个字符)为基本的加密单元
(二)以保密内容算法分类
受限制算法:算法的保密性基于对算法的保密,属于古典密码,用于军事领域
基于密钥算法:算法的保密性基于对密钥的保密,属于现代密码,基于柯克霍夫原则设计的算法
(三)以密码体制分类
对称密码:又称单钥密码或私钥密码,指加密密钥与解密密钥相同
非对称密码:又称双钥密码或公钥密码,指加密密钥与解密密钥不同,密钥分为公钥(对外公开),私钥(保密的)
对称密码算法:又称单钥密码算法或私钥密码算法,指应用于对称密码的加密,解密算法
非对称密码算法:又称双钥密码算法或公钥密码算法,指对应于非对称密码的加密,解密算法
(四)以明文处理方法分类
分组密码:指加密时将名分成固定长度的组,用同一密钥和算法对一块加密,输出也是固定长度的密文。多用于网络加密。
流密码:也称序列密码。指加密时每次加密一位或者一个字节明文
散列函数
散列函数用来验证数据的完整性
特点:
1.长度不受限制
2.哈希值容易计算
3.散列运算过程不可逆
散列函数的相关算法:
1.消息摘要算法MD5等
2.SHA--安全散列算法
3.MAC--消息认证码算法
数字签名
主要针对以数字的形式存储的消息进行的处理
OSI安全体系:
网络通信七层通信协议:
1.物理层
2.数据链路层
3.网络层
4.传输层
5.会话层
6.表示层
7.应用层
这七层通信协议有对应的安全机制:
加密机制
数字签名机制
访问控制机制
数据完整性机制
认证机制
业务流填充机制
路由控制机制
公证机制
七层通信协议对应的安全服务:
认证(鉴别)服务:指的是的是在整个网络交互过程中对于接收方和发送方的身份以及数据来源的验证
访问控制服务:防止没有被授权的用户来非法访问资源(如一个系统需要这个系统的用户才能登陆,那么不是这个系统的用户就无法登陆,没法访问这个系统的任何信息)
数据保密性服务:确保数据的安全有效,也就是说防止数据在传输的过程中不被泄露和篡改
数据完整性服务:保证数据在传输的过程中是原样传输的,没有被任何人或任何第三方的机器去改变它原有数据的内容。
抗否认性服务:防止发送和接受双方在执行各自的操作的时候否认自己的操作(比如说用户干了一件事,但是不承认是自己做的)。
TCP/IP安全体系:
TCP/IP参考模型:
1.网络接口层:对应OSI的物理层,数据链路层
2.网络层:对应OSI的网络层
3.传输层:对应OSI的传输层
4.应用层:对应OSI的应用层
TCP/IP安全体系结构:
网络接口层安全
网络层安全
传输层安全
应用层安全
安全服务与安全机制的对应关系:
安全服务:安全机制:
抗否认性服务 公正机制
数据完整性服务 数据完整性机制
数据保密性服务 加密机制,业务流填充机制
访问控制服务 访问控制机制,路由控制机制
认证(鉴别)服务 认证机制,数字签名机制
Java安全组成
1.JCA(Java Cryptography Architecture):Java加密体系结构
2.JCE(Java Cryptography Extension):Java加密扩展包
3.JSSE(Java Secure Socket Extension):Java安全套接字的扩展包
4.JAAS(Java Authentication and Authentication Service):Java鉴别与安全服务
JCA:提供基本加密框架(如:消息摘要,数字签名等)
JCE:在JCA的基础上扩展,提供了很多加密的算法(如:DES,AES,RSA算法通过JCE提供),主要在JDK的一些包中。
JSSE:提供基于SSL的加密功能,主要用于网络传输(在网络传输工程中,信息会经过很多主机,在任何一个物理节点或时间节点都有可能被(也就是说截取到这些信息),所以在网络传输信息是很不安全的)
JAAS:提供了在Java这个平台上进行用户身份验证的功能(也就是我们常说的基于java来开发的系统的权限或者安全)
JCA和JCE这两部分是java这个平台提供的一些用于安全和加密的API,他们只是提供了算法的一些接口
以下这10个是JDK自带的加密算法的provider:
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
security.provider.10=sun.security.mscapi.SunMSCAPI
使用JDK以外的扩展包需要修改资源文件并增加相关的内容,这是使用JDK以外的扩展包的一种方式。
配置文件的路径:
C:\Program Files\Java\jdk1.8.0_20\jre\lib\security\java.security
java安全相关的一些包和类:
jdk自带的:
java.security包:
为安全框架提供类和接口,通过在这个包中的java类的实现仅仅能够完成消息摘要算法的实现。
这个包中的源码是可见的。
javax.crypto包:
主要用于安全消息摘要,消息认证(鉴别)码。
通过这个包为我们所有需要加解密操作提供了接口和类,通过这个包中提供的一些类的操作,我们可以完整的实现一套加解密的算法以及这种安全摘要的算法。
java.net.ssl包:
安全套接字包。
主要提供一些基于安全套接字的一些类。
这个包的主要作用适合一些网络传输相关的一些加解密操作的。如:HttpURLConnection,SSLContext
第三方java扩展:(需要加密比较高)
Bouncy Castle:(是开源的)
两种支持方案:
1.配置
如:security.provider.1=sun.security.provider.Sun,等号后边是具体提供者的全类名
2.调用
通过API调用的方式
Commons Codec:(是开源的)
Apache提供的一个包。
主要支持:Base64,二进制,十六进制,字符集编码,同时也支持Url编码/解码
Base64算法
算法的实现方式:
1.jdk实现:Oracle提供的默认的实现
2.Commons Codec实现
3.Bouncy Castle实现
Base64算法的三种实现方式:
package com.timliu.security.base64;
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class Base64Test
{
public static final String src = "hello world";
public static void main(String[] args)
{
jdkBase64();
commonsCodesBase64();
bouncyCastleBase64();
}
// 用jdk实现
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 (Exception e) {
e.printStackTrace();
}
}
// 用Apache的common codes实现
public static void commonsCodesBase64()
{
byte[] encodeBytes = Base64.encodeBase64(src.getBytes());
System.out.println("common codes encode:" + new String(encodeBytes));
byte[] dencodeBytes = Base64.decodeBase64(encodeBytes);
System.out.println("common codes decode:" + new String(dencodeBytes));
}
// 用bouncy castle实现
public static void bouncyCastleBase64()
{
byte[] encodeBytes = org.bouncycastle.util.encoders.Base64.encode(src.getBytes());
System.out.println("bouncy castle encode:" + new String(encodeBytes));
byte[] dencodeBytes = org.bouncycastle.util.encoders.Base64.decode(encodeBytes);
System.out.println("bouncy castle decode:" + new String(dencodeBytes));
}
}
应用场景:
e-mail,密钥,证书文件
产生:邮件的“历史原因”
因为在开始逐渐产生的时候,如果传输一些非ASC码的值在不同的网关或者网络的时候就会出现问题,所以只传输ASC码的值,就产生了base64算法给这些ASC码加密。
定义:基于64个字符的编码算法
Base64算法的编码和解码的方式可以充当一个加解密的算法,但是因为Base64算法的计算方式和码表都是公开的,违反了柯克霍夫原则,比较容易被破解。
其实Base64就是用了一种替换的方式去实现的算法。
版权声明:本文为博主原创文章,未经博主允许不得转载。