PKI简介
PKI是Public Key Infrastructure的缩写,全称为公开密钥基础设施。PKI的出现是为了解决我们在一系列的网络活动中所碰到的安全问题。如果没有PKI等安全技术的支持,那么我们就无法对网络上传输的信息进行信任。PKI是一个基于X.509的,用于创建,分配和撤回证书的模型。PKI可以为所有网络中的应用提供加密,数字签名以及证书管理等功能。
PKI组成
- CA:权威证书机构CA。它管理公钥的整个生命周期,其作用包括:证书的发放,规定证书的有效期,发布证书作废列表CRL等
- RA:注册机构。我们可以理解RA是用户和证书机构之间的连接人,当用户需要申请一个身份证明书的时候,首先需要通过RA的注册审查,如果通过了资质要求,那么就可以获得CA给它颁发的证书。
- LDAP:PKI体系中用来存放证书的地方
- KMC:密钥管理中心。用于密钥备份和恢复,负责为CA系统提供密钥的生成,保存,备份,更新,恢复,查询等操作服务。
- CRL:证书作废列表。这里面维护了已经作废的证书,可供客户端去查询。
数字证书
数字证书格式
在PKI体系中,证书是一个非常关键的存在,下面我们就稍微详细的介绍一下数字证书。数字证书(Digital Certificate)也叫做电子证书,它就好比我们的身份证一样。身份证标识我们每个人的出生地,年龄等基础信息,通过这些信息可以快速的定位到一个人。而网络的世界中如果想要有这种效果,那么这时候就该数字证书登场了。只有经过CA签发的数字证书在网络中才具备可认证性。这个CA可以认为是现实世界中的公安机关。
数字证书一般包括版本信息,证书序列号,签名算法,有效期,公钥,指纹(也称为数字签名)和其他一些额外的扩展信息。下图就是一个具体的证书实例。
数字证书的编码格式
数字证书的一般编码格式包括PEM和DER两种
数字证书的文件扩展名
PKI体系中使用的算法分类
对称加密算法
指加密和解密使用相同密钥的加密算法。有时候又叫传统密码算法,就是加密密钥可以通过解密密钥推算出来,反之也成立。在大多数的对称算法中,加密密钥和解密密钥是相同的。所以也称这种算法为秘密密钥算法或单密钥算法。
非对称加密算法
非对称加密算法需要两个密钥,一个公开密钥,一个私有密钥。公钥和私钥是一对。如果用公钥对数据进行加密,那么只有对应的私钥能够解密。
消息摘要算法
摘要算法又称为散列算法,其核心在于散列函数的单向性。即通过散列函数可获得对应的散列值,但不能通过散列值反推出原始信息。
数字签名算法
数字签名算法要求能够验证数据的完整性,认证数据来源,并起到抗否认性的作用。现实世界中比如我们在借钱给朋友A的时候,会要求签订一个借款合同上面有朋友A按捺的指纹信息。这里面有两层含义,一是如果将来我们缺钱要朋友还的时候,会去找朋友A让她还钱,而不是找朋友B或别的朋友,这里面去找特定的朋友还钱就可以理解为认证数据来源。因为我们是通过借款合同上的指纹去追踪出借的钱给谁了。二是如果朋友A耍赖不还钱,这时候我们就可以起诉她或者做一些别的操作什么的,因为借款合同上有她的指纹信息,她无论如何都是不能抵赖的。这里就体现出了抗否认性。而消息摘要算法是验证数据完整性的最佳算法。所以摘要算法是组成数字签名算法的重要一部分。
有了数据完整性的保证,接下来我们希望数据的发送方可以对自己发送的数据做一些处理(签名处理)并生成一个凭证(签名)。数据接收方在接受到信息后可以验证该签名是不是和发送方发送的数据相符。如果任何人都可以对这段信息进行签名,那签名本身就没有什么意义了。所以签名操作一定只能由消息发送方自己操作,签名验证操作由接收方操作。既然签名操作只能由发送方操作,那这个操作本身是基于发送方一些私有的信息进行的。并且验证操作的信息是由发送方公布给接收方的。用于签名的相关信息私有,用于验证的相关信息公开,且这两者成对出现。而非对称加密算法的公私钥就符合这个条件。所以非对称加密算法也是数字签名算法组成的重要分子。
不同算法之间的区别
- 对称/非对称加密算法用于对数据的加解密操作,确保数据的机密性
- 数字签名算法用于对数据进行签名/验证操作,确保数据的完整性和抗否认性
- 摘要算法用于对数字证书本身做摘要处理,确保数字证书完整性
Padding填充
在对称加密体系中,当我们在加密数据的时候,一般有两种方式。一种是对明文中的单个位(或字节)进行加解密,称为流密码(序列密码)。一种是把明文信息划分为不同的组(或块)结构,分别对每组(或块)进行加解密,称为分组密码。我们在对明文进行分组加密的时候,不可能所有的明文都是恰好符合我们整数分组。有时候会出现不满分组的情况(比如分组为16,但是最后一组却是10),这时候就需要对最后一组进行填充操作,使之满足分组要求。
流密码体系
流密码体系包括同步流密码和自同步流密码。同步流密码:应用同步流密码,信息发送方和接收方在传递信息时,同步进行加密解密操作,明文与密文一一对应。密文的内容如果在传输过程中被篡改、删除或插入,可导致同步失效,以致密文解密失败,必须通过重新同步来实现解密、恢复密文。在密文传输过程中,如果一个密文位发生变化,那么该位的变化只影响该位的恢复,对后续密文位不影响,这是同步流密码的一个重要特点。自同步流密码:与同步流密码相比,自同步流密码是一种有记忆变换的密码。每一个密钥与已产生的固定数量的密文位有关,密钥由已生成的密文决定。在密文传输过程中,如果一个密文位发生变化,那么该位的变化会影响到后续有限(如n位)的密文位的正确解密。所以,自同步流密码有错误传递现象。但是,在接收n位正确密文字符后,密码自身会实现重新同步。基于这一特点,如果主动攻击者对密文做了修改,接收方仍然不能检测出密文的完整性。
分组密码体系
分组密码多应用于网络加密,是对称密码体制中发展最为完善的密码体制。分组密码对固定长度的一组明文进行加密,这一固定长度称为分组长度。分组长度是分组密码的一个参数,它与分组算法的安全性成正比,其取值范围取决于实际应用的环境。
分组密码工作模式
- 电子密码本模式–ECB,每次加密均产生独立的密文分组,每组的加密结果不会对其他分组产生影响,相同的明文加密后对应产生相同的密文,无初始化向量(也称为加密向量)。
- 密文链接模式–CBC,明文加密前需先与前面的密文进行异或运算(XOR)后再加密,因此只要选择不同的初始向量,相同的明文加密后产生不同的密文。
- 密文反馈模式–CFB,它类似于自同步流密码,分组加密后,按8位分组将密文和明文进行移位异或后得到输出同时反馈给移位寄存器。它的优点是可以按字节逐个进行加密解密,也可以按n位字节处理。CFB是上下文相关的,明文的一个错误会影响后面的密文(错误扩散)。CFB需要一个初始化向量,加密后与第一个分组进行异或运算产生第一组密文;然后,对第一组密文加密后再与第二个分组进行异或运算取得第二组密文;以此类推,直到加密完毕。
- 输出反馈模式–OFB,它将分组密码作为同步流密码运行,和CFB相似,不过OFB用的是前一个n位密文输出分组反馈给移位寄存器,OFB没有错误扩散问题。该模式产生与明文异或运算的密钥流,从而产生密文,这一点与CFB大致相同,唯一的差异是与明文分组进行异或的输入部分是反复加密后得到的。
- 计数器模式–CTR,它的特点是将计数器从初始值开始计数所得到的值发送给分组密码算法。随着计数器的增加,分组密码算法输出连续的分组来构成一个位串,该位串被用来与明文分组进行异或运算。计数器模式是用来提取分组密码的最大效能以实现保密性的。在AES的实际应用中,经常会选择CBC模式和CTR模式,但更多的是选择CTR模式。
对称加密算法工作模式填充方式列表(JDK版)
算法 | 密钥长度 | 工作模式 | 填充方式 |
---|---|---|---|
DES | 56 | ECB,CBC,PCBC,CTR,CTS,CFB,CFB8至CFB128,OFB,OFB8至OFB128 | NoPadding,PKCS5Padding,ISO10126Padding |
DESede(Triple DES,3DES) | 112,168(default value) | ECB,CBC,PCBC,CTR,CTS,CFB,CFB8至CFB128,OFB,OFB8至OFB128 | NoPadding,PKCS5Padding,ISO10126Padding |
AES | 128(default value),192,256 | ECB,CBC,PCBC,CTR,CTS,CFB,CFB8至CFB128,OFB,OFB8至OFB128 | NoPadding,PKCS5Padding,ISO10126Padding |
Blowfish | 32至448(8的倍数)(default value 128) | ECB,CBC,PCBC,CTR,CTS,CFB,CFB8至CFB128,OFB,OFB8至OFB128 | NoPadding,PKCS5Padding,ISO10126Padding |
RC2 | 40至1024(8的倍数)(default value 128) | ECB | NoPadding |
RC4(ARCFOUR) | 40至1024(8的倍数)(default value 128) | ECB | NoPadding |
PBEWithMD5AndDES | 56(default value) | CBC | PKCS5Padding |
PBEWithMD5AndTripleDES | 112,168(default value) | CBC | PKCS5Padding |
PBEWithSHA1AndDESede | 112,168(default value) | CBC | PKCS5Padding |
非对称加密算法工作模式填充方式列表(JDK版)
算法 | 密钥长度(默认值) | 工作模式 | 填充方式 |
---|---|---|---|
DH | 512~1024(64的倍数) | —— | —— |
RSA | 512~65536(64的倍数) | ECB | NoPadding,PKCS1Padding,OAEPWITHMD5AndMGF1Padding,OAEPWITHSHA1AndMGF1Padding,OAEPWITHSHA256AndMGF1Padding |
ECDH | 112~571 | —— | —— |
对称加密算法工作模式填充方式列表(Bouncy Castle版)
算法 | 密钥长度 | 工作模式 | 填充方式 |
---|---|---|---|
DES | 56(default value),64 | ECB,CBC,PCBC,CTR,CTS,CFB,CFB8至CFB128,OFB,OFB8至OFB128 | PKCS7Padding,ISO10126d2Padding,X932Padding,ISO7816d4Padding,ZeroBytePadding |
DESede(Triple DES,3DES) | 128,168(default value),192 | ECB,CBC,PCBC,CTR,CTS,CFB,CFB8至CFB128,OFB,OFB8至OFB128 | PKCS7Padding,ISO10126d2Padding,X932Padding,ISO7816d4Padding,ZeroBytePadding |
AES | 128(default value),192,256 | ECB,CBC,PCBC,CTR,CTS,CFB,CFB8至CFB128,OFB,OFB8至OFB128 | PKCS7Padding,ZeroBytePadding |
IDEA | 128(default value) | ECB | PKCS5Padding,PKCS7Padding,ISO10126Padding,ZeroBytePadding |
PBEWithMD2AndDES | 64 | CBC | PKCS5Padding,PKCS7Padding,ISO10126Padding,ZeroBytePadding |
非对称加密算法工作模式填充方式列表(Bouncy Castle版)
算法 | 密钥长度 | 工作模式 | 填充方式 |
---|---|---|---|
RSA | 512至65536位(64的倍数)(default value 2048) | NONE | NoPadding,PKCS1Padding,OAEPWithMD5AndMGF1Padding,ISO9796-1Padding等 |
快来和博主打成一片吧_
参考文献
- Java加密与解密的艺术
- https://zh.wikipedia.org/wiki/%E5%A1%AB%E5%85%85_(%E5%AF%86%E7%A0%81%E5%AD%A6)
- https://kangzubin.com/certificate-format/
- https://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html