密码学
以下为本人整理的密码学的相关理论知识,如有不妥,欢迎指正!
密码算法
密码算法也经常称为密码,是密码学中最重要的一个概念。密码算法是一个数据变换,其中一个变换作用于数据源项称为明文,变换后所产生的相应数据项称为密文。另一个变换作用于密文,变换后恢复出明文。这样的两个变换被分别称为加密算法和解密算法。实施上面的两个过程也被称为加密和解密。
针对一个算法,所有可能的明文构成的集合被称为明文空间,所有可能的密文构成的集合被称为密文空间,而所有可能的密钥构成的集合被称为密钥空间。
历史上的密码
凯撒密码
凯撒密码是一种相传尤利乌斯·凯撒曾使用过的密码,凯撒是一位著名的军事统帅.
凯撒密码是通过将明文中所使用的字母表按照一定的字数“平移“来进行加密的.
暴力破解(穷举搜索)
将所有可能的密钥全部尝试一遍,这种方法称为暴力破解,由于这种方法的本质是从所有的密钥中找出正确的密钥,因此又称穷举搜索.
简单替换密码
将明文中所使用的字母表替换为另一套字母表的密码称为简单替换密码,凯撒密码也可以说是简单替换密码的一种.
密钥空间
一种密码能够使用的”所有的密钥的集合“称为密钥空间,所有可用密钥的总数就是密钥空间的大小.密钥空间越大,暴力破解就越困难.
频率分析破译密码
使用暴力破解很难破译简单替换密码,但使用被称为频率分析的密码破译方法,就能够破译简单替换密码.
频率分析利用了明文中的字母的出现频率和密文中的字母的出现频率一致这一特性进行破译密码
Enigma
Enigma是由德国人阿瑟·谢尔比乌斯于20世纪初发明的一种能够进行加密和解密操作的机器.
Engima是一种由键盘、齿轮、电池和灯泡所组成的机器,通过这一台机器就可以完成加密和解密两种操作.
- 缺点
- Enigma在每次输入时,通过3个转子的旋转来改变电路,然而在加密通信密码这一重要步骤实际上只有转子1会旋转;
- 将通信密码连续输人两次并加密
- 通信密码是人为设定的
- 必须派发国防密码本,如果泄露一本密码本,就要重新制作新密码本并发放到全军,涉及到密钥配送问题
密码算法和密钥分开的原因
- 凯撒密码
密码算法:将明文中的各个字母按照指定的字母数平移
密钥:平移的字母数量
- 简单替换密码
密码算法:按照替换表对字母表进行替换
密钥:替换表
- Enigma(通信密码的加密)
密码算法:使用Enigma密码机,通过接线板的接线方式、3个转子的顺序、每个转子的旋转位置对字母进行替换
密钥(每日密码):接线板的接线方式、3个转子的顺序、每个转子的旋转位置
- Enigma(通信电文的加密)
密码算法:使用接线板的接线方式和3个转子的顺序固定的Engima密码机,按照每个转子的旋转位置对字母进行替换.
密钥(通信密码):每个转子的旋转位置
密码算法是需要重复使用的,但在重复使用同一算法的过程中,该算法被破译的可能性也在逐渐增大.因为,密钥作为密码算法中的可变部分,并在每次通信时都对这部分内容进行改变,这样就解决了希望重复使用,但重复使用会增加风险这个难题.
对称密码算法
加密密钥和解密密钥相同的密码算法被称为对称密码算法。为了保证安全,通信双方必须保证密钥不泄露。双方通过共享一个必须保密的密钥进行加密和解密,所以,对称加密也称为秘密密钥密码。
根据密码算法对数据的处理方式,可以分为分组密码算法和序列密码算法。序列密码算法又称为流密码算法。
对称密码算法一般具有运算速度快和占用内存小的特点。
对称密码算法有DES 3DES AES RC5 RC6 IDEA
- 优点
算法公开、加密速度快、计算量小、加密效率高
- 缺点
密钥的管理和分发非常困难,不够安全。在数据传送前,发送方和接收方必须商定好密钥,然后双方都必须保存好密钥,如果一方的密钥被泄露,那么加密信息就不安全了。除此之外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一密钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。经计算,N个人通讯需要:N(N-1)/2
编码
将现实世界中的东西映射为比特序列的操作称为编码,例如ASCII编码
XOR
全称exclusive or,中文里叫做异或
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
如果将0理解为偶数,将1理解为奇数,就可以将XOR和一般的加法运算等同起来
一次性密码本–绝对不会被破译的密码
一次性密码本是一种非常简单的密码,它的原理是“将明文与一串随机的比特序列进行XOR运算”.
为什么一次性密码本是绝对无法破译的?
如果进行暴力破解,总有一天我们会尝试到和加密时相同的密钥,但是解密出来的明文我们无法判断它是否是正确的明文,所以说一次性密码本是无条件安全的,理论上是无法破译的.
一次性密码为什么没有被使用?
从以下五个角度考虑:
- 密钥的配送
- 密钥的保存
- 密钥的重用
- 密钥的同步
- 密钥的生成
Base64编码
Base64是一种用64个字符来表示任意二进制数据的方法,它是一种编码方式,而非加密方式。它通过将二进制数据转换为64个”可打印字符”,完成了数据在HTTP协议上的传输。
Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换为字符数据。然而直接转换是不行的,因为网络传输只能传输可打印字符。
可打印字符:在ASCII码中规定,0-31、128这33个字符属于控制字符,32-127这95个字符属于可打印字符,也就是说网络传输中只能传输这95个字符,不在这个范围内的字符是无法传输的,那么如何才能传输其他字符呢,其中一种方式就是使用Base64
Base64,就是使用64个可打印字符来表示二进制数据的方法,这64个字符中包括大小写字母、数字、+和/,还有用来补缺的特殊字符=。
分组密码算法
将明文分成大小相同的块,然后进行加解密算法。常见的分组算法有DES、3DES、AES、RC5、RC6、IDEA等。
序列密码算法
将明文当成一个序列直接与密钥产生的伪随机序列进行作用来加解密。常见的序列密码算法有RC4等。
DES算法
DES算法为密码体制中的对称密码体制,又被称为美国密码加密标准.
DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法.
密钥长64位,密钥事实上是56位参与DES运算(第8 、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数1),分组后的明文组和56位密钥按位替代或交换的方法形成密文组。
其入口参数有三个:key、data、mode为加密解密使用的密钥,data为加密解密的数据,mode为其工作方式,当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的54位
- 初始置换和终止置换
初始和终止置换其实都是按照这两张表的规则置换的,具体的规则是按照这两张表,把划分好的64位进行重新排序,如初始置换表所示把第64位的第58位放到第一位,第50位放到第二位,以此类推…,终止置换也是这个原理
- 扩展置换
经过初始置换的64位数据被分为左右32位数据,对其中一边的数据进行扩展置换得到48位的数据。
扩展置换的目的有两个:生成与密钥相同长度的数据进行异或运算;提供更长的结果,在后续的替代运算中可以进行压缩
-
密钥置换
不考虑每个字节的第8位,DES的密钥由64位减至56位,每个字节的第8位作为奇偶校验位。
在DES的每一轮中,从56位密钥产生出不同的48位子密钥,确定这些子密钥的方式如下:
1)将56位的密钥分成两部分,每分别28位。
2)根据轮数,这两部分分别循环左移1位或者2位。
移动后,从56位中选出48位。这个过程中,既置换了每位的顺序,又选择了子密钥,因此称为压缩置换
-
S盒压缩处理
压缩后的密钥与扩展分组异或以后得到48位的数据,将这个数据送入S盒,进行替代运算。替代由8个不同的S盒完成,每个S盒有6位输入4位输出。48位输入分为8个6位的分组,一个分组对应一个S盒,对应的S盒对各组进行代替操作。
- P盒置换
S盒代替运算的32位输出按照P盒进行置换。该置换把输入的每位映射到输出位,任何一位不能被映射两次,也不能被略去。
最后,P盒置换的结果与最初的64位分组左半部分L0异或,然后左、右半部分交换,接着开始另一轮。
优点:密钥较短,加密处理简单,加解密速度快,适用于加密大量数据的场合
缺点:密钥单一,不能由其中一个密钥推导出另一个密钥
3DES算法
3DES(即Triple DES)是DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。
该方法使用两个密钥,执行三次DES算法,加密的过程是加密-解密-加密,解密的过程是解密-加密-解密。
3DES加密过程为:C=Ek3(Dk2(Ek1§))
3DES解密过程为:P=Dk1(EK2(Dk3©))
采用两个密钥进行三重加密的好处有:
①两个密钥合起来有效密钥长度有112bit,可以满足商业应用的需要,若采用总长为168bit的三个密钥,会产生不必要的开销。
②加密时采用加密-解密-加密,而不是加密-加密-加密的形式,这样有效的实现了与现有DES系统的向后兼容问题。因为当K1=K2时,三重DES的效果就和原来的DES一样,有助于逐渐推广三重DES。
③三重DES具有足够的安全性,还没有关于攻破3DES的报道。
AES算法
高级加密标准,在密码学中又称为Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
AES的区块长度固定为128比特,密钥长度则可以是128,192或256比特;
加密原理:
AES加密过程涉及到4种操作,分别是字节替代、行移位、列混淆和轮密钥加。解密过程分别为对应的逆操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。加解密中每轮的密钥分别由初始密钥扩展得到。算法中16个字节的明文、密文和轮密钥都以一个4x4的矩阵表示。
算法特点
运算速度快,安全性高,资源消耗少
对称加密算法比较
名称 | 密钥长度 | 运算速度 | 安全性 | 资源消耗 |
---|---|---|---|---|
DES | 56位 | 较快 | 低 | 中 |
3DES | 112位或168位 | 慢 | 中 | 高 |
AES | 128、192、256位 | 快 | 高 | 低 |
模式
分组密码算法只能加密固定长度的分组,但是我们需要加密的明文长度可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密.而迭代的方法就称为分组密码的模式.
ECB模式
ECB模式被称为电子密码本模式,这种模式是将明文按分组长度划分为相等的数据块,然后对每一块数据进行加密计算。
使用ECB模式,存在一定的缺陷:
1)对于同一个密钥,相同的明文就会产生相同的密文,攻击者虽然无法破解算法,但可以收集数据,制作一定规模的明密文对照表,进而按密文从表中查找出明文;
2)在通信中,不能防范分组的重放、插入和删除等攻击。
使用CBC模式、CFB模式、OFB模式能够克服ECB模式的缺陷。
CBC模式
CBC模式全称是密文分组链接模式,在CBC模式下,每个明文分组在加密前,先与前一分组的密文按比特异或,然后再进行加密操作。第一个明文分组在加密前,与初始化向量IV按比特异或,然后再加密。加解密双方事先要商定相同的IV。
CFB模式
CFB模式的全称是密文反馈模式,在CFB模式下,加密操作是对一个移位寄存器进行的。每次只输入kbit(k小于分组长度)明文,与上一分组密文的前kbit按比特异或,得到kbit密文,同时将异或结果反馈到移位寄存器中。
OFB模式
OFB模式的全称是输出反馈模式,OFB模式与CFB模式类似,只是反馈到移位寄存器中的kbit是加密计算的输出,而不是异或结果。
公钥密码算法(非对称密码算法)
公钥密码算法中最为重要的一个概念就是单向陷门函数,简单的解释就是一个数学函数,仅仅可以单向计算,即可以由输入计算得到输出,但从输出计算得到输入在计算上是不可行的。利用单向陷门函数,可以构造出一种非对称的加密方法,即公钥密码算法。公钥密码算法克服了对称密码算法的缺陷,能够通过公开的信道进行密钥交换。
在公钥密码算法中,加密密钥与解密密钥是不同的。用户可以公开发布其中一个密钥(称为公钥),秘密地保存另一个密钥(称为私钥)。一个安全的公钥密码算法,攻击者不能从公钥推导出私钥,或者从公钥加密的密文和公钥推导出明文,也不能从公钥以及有限的明文和用私钥处理后得到的密文对推导出私钥。由于公钥不能推导出私钥,公钥就可以通过公开 信道传输或者发布。每个用户都拥有自己的公钥和私钥,他们必须成对使用,所以也经常被称为公私密钥对。
非对称加密需要两个密钥:公钥和私钥.公钥和私钥是一对,如果用公钥对数据加密,那么只能用对应的私钥解密,如果用私钥对数据加密,只能用对应的公钥进行解密.因为加密和解密用的是不同的密钥,所以称为非对称加密.
非对称加密算法保密性好,它消除了最终用户交换密钥的需要.但是加解密速度要远远慢于对称加密,在某些极端情况下,甚至能比对称加密慢上1000倍.
非对称算法主要有RSA DSA ECC DH 算法
RSA算法
RSA算法是由Rivest Shamir和Adleman在1978年公开提出的一种公钥密码算法,RSA算法是第一个设计完善的公钥密码算法.该算法的数学基础是Euler定理,并建立在大整数分解的困难性之上,即:将两个大素数乘起来是相对容易的,而分解两个大素数的积是计算上是不可行的.
RSA算法描述如下:
密钥生成:
第一步:随机选择两个不相等的质数p和q
第二步:计算p和q的乘机n
计算
第三步:计算n的欧拉函数φ(n)
计算φ(n) = (p-1)(q-1)
第四步,随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质。
第五步,计算e对于**φ(n)**的模反元素d.
第六步:将n和e封装成公钥,n和d封装成私钥
公开(n,e)作为公钥,保留(n,d,p,q)作为私钥
RSA加密
在RSA中,明文、密钥和密文都是数字.RSA的加密过程可以用下列公式来表达,这个公式很重要:
密文=明文^E mod N (RSA加密)
也就是说,RSA的密文是对代表明文的数字的E次方求mod N的结果.换句话说,就是将明文和自己做E次乘法,然后将其结果处以N求余数,这个余数就是密文.
E和N的组合就是公钥
RSA解密
RSA的解密和加密一样简单,可以用下面的公式来表达:
明文=密文^D mod N (RSA解密)
也就是说,对表示密文的数字的D次方求mod N就可以得到明文.换句话说,将密文和自己做D次乘法,再对其结果处以N求余数,就可以得到明文了
D和N的组合就是私钥
ECC算法
基于离散对数的椭圆曲线算法
ECC的主要优势是在某些情况下它比其他的方法使用更小的密钥——比如RSA加密算法——提供相当的或更高等级的安全。ECC的另一个优势是可以定义群之间的双线性映射,基于Weil对或是Tate对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。不过一个缺点是加密和解密操作的实现比其他机制花费的时间长。
对称密码与公钥密码
通过使用对称密码,我们就能够在通信中确保机密性.
通过使用公钥密码,就可以避免解密密钥的配送,从而解决了对称密码所具有的密钥配送问题
公钥密码存在的问题:
- 公钥密码的处理速度远远低于对称密码
- 公钥密码难以抵御中间人攻击
摘要算法(单向散列函数)
摘要算法是通过一系列的计算方法和规则,将输入的任意长度的数据转化成固定长度的返回值,这个值称为hash值,而这种算法被称为摘要算法、哈希算法、散列算法。
消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,目前可以被解密逆向的只有CRC32算法,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。
摘要算法的特点:
1)不可逆
2)输出固定长度
MD5固定长度为128,SHA-1位164,SHA-2根据加密级别有几种可选:224、256、384、512。SHA-3则为全新的算法。
3)速度快
4)唯一性(正确性):输入相同则输出绝对相同。在正确处理碰撞的情况下,也可以保证输入不同则输出也不同
常用的摘要算法有MD5 SHA-1 SHA-256
MD5:MD5信息摘要算法,一种被广泛使用的密码散列函数,可以产生出一个128位的散列值,用于确保信息传输完整一致。
特点:
1)稳定、运算速度快
2)压缩性:输入任意长度的数据,输出长度固定(128比特位)
3)运算不可逆:已知运算结果的情况下,无法通过逆运算得到原始字符串
- 高度离散:输入的微小变化,可导致运算结果差异巨大。
SHA-1: 安全哈希算法,SHA-1是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转换成长度较短、位数固定的输出序列即散列值。
差异处 | MD5 | SHA1 |
---|---|---|
摘要长度 | 128位 | 160位 |
运算步骤数 | 64 | 80 |
基本逻辑函数数目 | 4 | 4 |
常数数目 | 64 | 4 |
消息认证码
消息认证码是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC
消息认证码的输入包括任意长度的消息和一个发送者与接受者之间共享的密钥,它可以输出固定长度的数据,这个数据称为MAC值
-
消息认证码与单向散列函数区别
单向散列函数计算不需要密钥,消息认证码计算需要密钥
可以理解为消息认证码是一种与密钥相关联的单向散列函数
消息认证码无法防止否认
数字签名
直接对消息签名的方法
假设Alice与Bob进行消息传递,具体过程如下:
- Alice用自己的私钥对消息进行加密
- ALice将信息和签名发送给Bob
- Bob用Alice的公钥对收到的签名进行解密
- Bob将签名解密后得到的消息与Alice直接发送的消息进行对比
对消息的散列值签名的方法
直接对消息签名的这种方法非常耗时,因为公钥密码算法非常慢,导致对整个消息进行加密效率很低,所以这里用单向散列函数来解决这个问题.
假设Alice与Bob进行消息传递,具体过程如下:
- Alice用单向散列函数计算消息的散列值
- ALice用自己的私钥对散列值进行加密
- ALice将消息和签名发送给Bob
- Bob用ALice的公钥对收到的签名进行解密
- Bob将签名解密后得到的散列值与Alice直接发送的消息的散列值进行对比
签名两种功效:
一是确定消息确实是由发送方签名发过来的,因为别人假冒不了发送方的签名
二是数字签名能确定消息的完整性
对称密码与公钥密码的对比
对称密码 | 公钥密码 | |
---|---|---|
发送者 | 用共享密钥加密 | 用公钥加密 |
接受者 | 用共享密钥解密 | 用私钥解密 |
密钥配送问题 | 存在 | 不存在,但公钥需要另外认证 |
机密性 | O | O |
消息认证码与数字签名的对比
消息认证码 | 数字签名 | |
---|---|---|
发送者 | 用共享密钥计算MAC值 | 用私钥生产签名 |
接受者 | 用共享密钥计算MAC值 | 用公钥验证签名 |
密钥配送问题 | 存在 | 不存在,但公钥需要另外认证 |
完整性 | O | O |
认证 | O(仅限通信对象双方) | O(可适用于任何第三方) |
防止否认 | X | O |
数字签名无法解决的问题
- 用数字签名既可以识别出篡改和伪装,还可以防止否认,实现了确认消息的完整性、进行认证以及否认防止.
- 要正确使用数字签名,有一个大前提,那就是用于验证签名的公钥必须属于真正的发送者,即使数字签名算法再强大,如果你得到的公钥是伪造的,那么数字签名也会完全失效.
数字证书
数字证书是PK I中最重要的元素,数字证书中最基本的内容就是证书持有者的身份信息和公钥信息,以及用于验证证书完整性的CA签名结果。
数字证书存在的意义在于回答“公钥属于谁”的问题,以帮助用户安全地获取对方的公开密钥。证书中应包含公钥和公钥拥有者等信息,并由可被信任的CA签署,即CA对这些信息进行数字签名。
一张数字证书由证书内容、签名算法、签名结果组成。
需要使用他人证书的用户,依照签名算法,用CA的公钥验证签名结果,从而保证证书的完整性,安全地获得公钥。
证书内容
证书内容包括:版本号、证书主体、主体公钥信息、签发者、序列号、有效期
生命周期
证书的生命周期可以归纳为下面五个方面:
- 证书的产生操作(密钥生成、提交申请、审核检查和证书签发)
- 证书的使用操作(证书获取、验证使用和证书存储)
- 证书的撤销
- 证书的更新
- 证书的归档
一个由非根CA签发的数字证书的验证涉及下面的步骤:
- 首先审查持有者的证书是否有效,这包括查看证书是否已过失效日期,并且查看证书的撤销情况。
- 获取该证书的签发者的数字证书来验证证书上的签名,拿到签发者的数字证书后,同样需要检查证书是否已过失效日期,并且查看证书的撤销情况。该签发者数字证书上会有一个根CA的签名。
- 获取根CA证书,同样查看失效日期和证书撤销情况。由于根CA是自签名证书,那么不需要其他的证书来验证根证书上的签名。
- 用根CA的公钥来验证签发者CA的证书上的签名,确信了签发者CA的公钥。
- 用签发者CA的公钥来验证证书上的签名,因此可确认证书持有者的公钥。
- 注意查看证书撤销列表的时候,撤销列表也会由根CA或者下级CA的签名,验证撤销列表的证书的过程也类似于上述五步所描述的过程。
证书撤销的流程
- 订户或者其上级单位向RA提出撤销请求
- RA审查撤销请求
- 审查通过后,RA将撤销请求发送给CA或者CRL签发机构
- CA或者CRL机构签发机构修改证书状态,并签发新的CRL
发布证书撤销信息的基本思路
PKI系统中的CA机构将当前被撤销证书的标识(通常是证书序列号)集中到一个列表中,向PKI系统的所有用户公布.和签发证书一样,为了防止伪造和篡改,CA需要对这个列表进行数字签名.
使用CRL检查证书撤销状态的基本过程:
- 验证CRL本身的有效性,验证CRL上的数字签名是否正确 当前是否处于有效期
- 构造被撤销证书的证书序列号列表
- 检查证书是否已经被撤销
双证书
- 用于签名的私钥,根据电子签名法,由订户自己生成并专有掌握,对应的证书被称为“签名证书”;
- 用于加密的密钥,根据密码管理规定,由专门的可信机构(密钥管理中心KMC)生成并和订户共同掌握,用于密钥恢复,相应的证书被称为“加密证书”
签名证书申请
申请签名证书的操作流程与单证书体系中的申请流程相同:
- 申请者生成密钥对;
- 申请者将身份信息和公钥提交给RA;
- RA审核无误后,CA签发证书
加密证书申请
加密证书的申请流程需要密钥管理中心的介入:
- 申请者将身份信息交给RA,申请证书
- RA审核无误后,RA或者CA从KMC(密钥管理中心)获得密钥对
- CA签发证书,并和私钥一起交给申请者.
公钥基础设施(PKI)
公钥基础设施是为了能够更有效地运用公钥而制定的一系列规范和规格的总称.
PKI系统基本组件
在PKI技术的支持下,一个获取其他用户公钥的简化过程如下:
1)Bob生成自己的公私密钥对,将公钥和自己的身份证明交给CA;
2)CA检查Bob的身份证明后,为Bob签发数字证书,证书中包含Bob的身份信息和公钥信息,以及CA对证书的签名结果;
3)当Alice需要与Bob进行保密通信时,就可以查找Bob的证书,然后使用CA的公钥来验证证书上的签名是否有效,确保证书不是攻击者伪造的;
4)验证证书之后,Alice就可以使用证书上所包含的公钥与Bob进行保密通信和身份鉴别等。
PKI系统中最基本功能组件有3个,分别为CA、证书持有者和依赖方。
我们通常将使用证书服务的实体称为末端实体。
证书认证中心(CA)
证书认证中心是负责确定公钥归属的组件,CA通过证书方式为用户提供公钥的拥有证明,CA拥有自己的公私密钥对,对每一个“公钥证明的数据结构”进行数字签名,实现公钥获得的数据起源鉴别、数据完整性和非否认性。
用于公钥证明的数据结构,就是数字证书。
CA是PKI系统中通信双方都信任的实体,被称为可信第三方。CA作为可信第三方的重要条件之一就是CA的行为具有非否认性。CA通过证书证实他人的公钥信息,证书上有CA的签名。
证书持有者
持有证书的实体可能是用户、设备(如WWW服务器、路由器等)、进程、线程、软件系统等。
证书持有者是指拥有证书且证书上的身份信息属于自己的个体,即不仅拥有证书载明的身份,还掌握了证书上公钥所对应的私钥。证书持有者的真实含义实际上是公钥对应的私钥持有者。如果只是保存了其他人的证书,在本书中并不被称为证书持有者。
依赖方
依赖方是指使用其他人证书来进行加密通信、身份鉴别、数字签名验证等安全操作的实体。
与证书持有者一样,依赖方也可以是用户、设备、进程、线程、软件系统等。之所以被称为依赖方,是因为他信任CA的公钥,所以也就信任该CA签发的证书,从而也就信任对方的身份和公钥。
依赖方在使用证书之前,需要验证证书的真伪,所以,经常也被称为证书验证者。
辅助组件
在PKI系统中,除了CA、证书持有者、依赖方这三种实体组件之外,还包括注册机构、资料库系统、密钥管理系统、OCSP服务器、CRL Issuer等各种辅助组件
注册机构(RA)
CA确保证书上信息的真实有效,在签发证书之前,必须要进行下列各种操作:
1)验证申请者提交的公钥信息
2)对申请者进行身份验证,确定身份信息无误
3)检查申请者希望在证书中出现的其他信息
4)其他方面的检查
5)获取订户的管理用信息
上述的信息检查和管理,涉及多方面的内容,通常任务是比较繁重的,而且有时候还需要实时在线通信。PKI系统中通常都会设计有注册机构,作为CA与申请者的交互接口,专门负责各种信息的检查和管理工作。只有在对申请者的各种检查都通过之后,RA才会将信息发送给CA,要求CA签发证书。
资料库
PKI系统通常会设计专门的组件来实现证书分发,称为资料库。资料库负责存储所有的证书,供用户下载
CRL Issuer 和 OCSP服务器
PKI系统不仅要提供绑定公钥与身份的方法,同时必须提供一种解除这种绑定的方法,即能够让用户有“改正错误”的途径。PKI用证书撤销为用户提供“改正错误”的能力,最常见的证书撤销方式就是证书撤销列表(CRL)。在CRL中,包含了当前所有被撤销证书的标识,验证者根据最新的CRL就能够判断证书是否被撤销。
CRL Iusser就是在PKI系统中,专门负责签发CRL的组件。在PKI系统中引入可选的CRL Issuer,主要是考虑到下列的原因:
1)更好的保护CA
2)更好地方便用户
3)方便实施安全策略
4)实施不同的撤销策略
OCSP协议是一种实时检查证书撤销状态的标准协议,OSCP协议是一种“请求-响应”协议。
OSCP能够提供实时的、无延迟的证书撤销信息,而且OSCP的响应消息短,传输带宽小,处理更容易,比CRL更适用于有网连接但带宽受限或者弱终端的应用场合。
双证书操作流程
双证书体系中,申请签名证书的操作流程(和单证书体系申请流程相同):
- 申请者生成密钥对;
- 申请者将身份信息和公钥提高给RA;
- RA审核无误后,CA签发证书;
加密证书的申请流程:
- 申请者将身份信息交给RA,申请证书;
- RA审核无误后,RA或者CA从KMC获得密钥对;
- CA签发证书,并和私钥一起交给申请者。
证书描述方法
ASN.1语法记法标准是一种既简单、又没有歧义的内容描述语言,ASN.1采用类似编程语言的数据结构定义方法,要定义复杂的结构体,在ASN.1中首先要定义一定数量的“简单类型”,然后通过构造出各种比较复杂的“构造类型”
在PKI系统中关于目录、名字、证书、通信协议的诸多地方用到了ASN.1
ASN.1的四种构造方式
1)SEQUENCE
SEQUENCE表示1个或多个字段组成的有序序列
2)SEQUENCE OF
SEQUENCE OF 表示0个或多个特定类型字段的有序序列
3)SET
SET表示1个或多个字段组成的无序集合
4)SET OF
SET OF表示0个或多个特定类型字段的无序集合
X.509标准
X.509标准是ITU-T(远程通信标准化组织)设计的PKI标准,他是为了解决X.500目录中身份鉴别和访问控制问题而设计的
在X.509标准的早期版本中,除了最基本的组件----CA 证书持有者和依赖方外,只涉及了资料库,由于X.509标准是为X.500目录服务的,所以,资料库的形式就是X.500目录.在后来的X.509标准版本中,又增加了CRL Issuer组件
在X.509标准中,使用了大量的篇幅来定义证书和CRL的数据格式.
X.509证书
X.509证书分为三大部分:
1)证书内容 tbsCertificate
2)签名算法 signatureAlgorithm
3)签名结果 signatureValue
用ASN.1语法描述如下:
Certificate ::= SEQUENCE{
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING
}
签名算法为CA对tbsCertificate进行签名所使用的算法:类型为AlgorithmIdentifier,其ASN.1语法为:
AlgorithmIdentifier::=SEQUENCE{
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}
签名结果是CA对tbsCertificate进行签名的结果,类型为BIT STRING
证书内容是需要被CA签名的信息,ASN.1 描述如下:
TBSCertificate ::=SEQUENCE{
version [0]EXPLICIT Version DEFAULT v1,
serialNumber CertificateSerialNumber,
signature AlgorithmIdentifier,
issuer Name,
validity Validity,
subject Name,
subjectPublicKeyInfo SubjectPublicKeyInfo,
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
extensions [3] EXPLICIT Extensions OPTIONAL
}
X.509证书都是采用DER编码
交叉认证
交叉认证是通过CA对其他CA签发证书的方式,扩大自己的信任范围,使得信任自己的依赖方能够与更多的证书持有者进行安全通信.
交叉认证所签发的证书,被称为交叉证书
签发交叉证书的CA被称为中间CA;
持有交叉证书的CA被称为主体CA;
缺点
当多个CA两两进行交叉认证就会形成网状结构
- 证书路径有可能很长,使得依赖方要查找大量的证书;
- 证书路径认证很长,会有多种选择,还包括了环路,证书认证路径构建非常复杂;
- 因多次证书映射而导致证书策略不可用.
桥CA
当一个CA与桥CA相关信任(双向交叉认证)之后,就能够同时成为信任方(信任桥CA体系中的其他CA)和被信任方(被桥CA系统中的其他CA所信任)
桥CA并不是信任锚,桥CA的作用在于扩展其他信任锚的信任传递空间.
特点:
- 证书认证路径更加简单,不会形成环路;
- 证书策略映射次数较少;
- 与桥CA进行交叉认证,就同时与多个CA建立了信任关系,实现了对等的系统互联.
证书扩展
证书中用对象标识符(Object Identifier,OID),表示扩展信息的类型,同时每种不同类型的扩展有不同结构的扩展指.
-
在同一张证书中,不应该同时包含多个具有相同OID的证书扩展.
-
在PKI应用系统处理证书扩展的时候,如果碰到不知道如何解码的扩展项,就作如下处理:对于关键性扩展,认为该证书是非法的证书;对于非关键性扩展,则忽略跳过该扩展项,继续对证书进行处理.
根据IETF RFC 3280标准,X.509证书扩展格式的ASN.1描述如下:
Extensions ::= SEQUENCE SIZE(1..MAX)OF Extension
Extension ::= SEQUENCE{
extnID OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTER STRING
}
每个证书扩展包括了扩展OID、扩展关键性和扩展值,每一张证书可以包含多个不同类型的证书扩展,多个证书扩展组织为Extensions格式,不同的扩展具有不同的恶扩展值格式.在对证书扩展值编码时,必须先按照相格式编码,然后将编码结果作为OCTER STRING 再进行一次编码.
密钥和证书策略信息扩展
密钥用法
密钥用法扩展用于指定证书所对应密钥的允许用途
Key Usage扩展的OID是{ id-ce 15},即2.5.29.15
扩展值的ASN.1描述如下:
KeyUsage ::= BIT STRING{
digitalSignature (0),
nonRepudiation (1),
keyEncipherment (2),
dataEncipherment (3),
keyAgreement (4),
keyCertSign (5),
cRLSign (6),
encipherOnly (7),
decipherOnly (8)
}
7种证书密钥用途一件2种辅助用途的说明如下:
- digitalSignature: 表示私钥可以用于除了签发证书、签发CRL和非否认性服务的各种数字签名操作,而公钥用来验证这些签名
- nonRepudiation: 表示私钥可以用于进行非否认性服务中的签名,而公钥用来验证签名
- keyEncipherment: 表示密钥用来加密传输其他的密钥
- dataEncipherment: 表示公钥用于直接加密数据.一般会很少有这种方式的应用,因为在密钥长度安全的情况下,公钥的计算都是慢于对称密码计算的.
- keyAgreement: 表示密钥用于密钥协商
- keyCertSign: 表示私钥用于证书签名,而公钥用于验证证书签名,专用于CA证书,当这个位置被置为1时,表示证书是CA证书,因而Basic Constraints扩展中CA的值应该设定为TRUE.
- cRLSign: 表示私钥可用于对CRL签名,而公钥可用于验证CRL签名.对于用来签发CRL的CA或者CRL Issuser的证书中,扩展的这个位应该置为1
- encipherOnly: 表示证书中的公钥在密钥协商过程中,仅仅用于加密计算,配合key Agreement使用才有意义,即当keyAgreement和encipherOnly都被置1时,该密钥只能用来在密钥协商的过程中加密数据
- decipherOnly: 表示证书中的公钥在密钥协商过程中,仅仅用于解密计算,配合key Agreement使用才有意义,即当keyAgreement和encipherOnly都被置1时,该密钥只能用来在密钥协商的过程中解密数据
在双证书体系中,必须要严格区分加密密钥和签名密钥,而且要求应用系统必须明确地知道是加密证书还是签名证书,所以Key Usage扩展必须为关键扩展.
对于加密密钥/加密证书,必须将keyEncipherment、dataEncipherment、keyAgreement设置为1,将digitalSignature、nonRepudiation设置为0,encipherOnly、
decipherOnly由CA自主决定
对于签名密钥/签名证书,必须将keyEncipherment、dataEncipherment、keyAgreement设置为0,将digitalSignature、nonRepudiation设置为1,encipherOnly、
decipherOnly可以随意设置(由于Key Agreement不可用,因而encipherOnly和decipherOnly被置为0或1都不会对证书用途产生影响)
扩展的密钥用法
在证书中,Key Usage扩展比较宽泛,不够具体,扩展的密钥用法也是用于指定证书所对应密钥允许的用途.相对于Key Usage扩展,它能够给出更详细、具体的用途,通常,这个扩展出现在末端实体证书中.
Extended Key Usage扩展的OID为{ id-ce 37 },即2.5.29.37,一般情况下,这个扩展既可以设定为关键性扩展,也可以设定为非关键性扩展.
扩展值的ASN.1描述如下:
ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId
KeyPurposeId ::= OBJECT IDENTIFIER
以OID的形式区分密钥的用途,常用的OID有:
- anyExtendedKeyUsage(2.5.29.37.9):表示应用于任意用途
- id-kp-serverAuth(1.3.6.1.5.5.7.3.1):表示用于SSL的服务端验证
- Id-kp-clientAuth(1.3.6.1.5.5.7.3.2):表示用于SSL的客户端验证
- id-kp-codeSigning(1.3.6.1.5.5.7.3.3):表示用于代码签名
- Id-kp-emailProtecting(1.3.6.1.5.5.7.3.4):表示用于电子邮件的加解密、签名等.
私钥使用期限
用于说明证书对应私钥的使用期限
Private Key Usage Period扩展的OID为{ id-ce 16 },即2.5.29.16,一般不推荐使用,使用也是非关键性扩展
扩展值的ASN.1描述如下:
PrivateKeyUsagePeriod ::={
notBefore [0] GeneralizedTime OPTIONAL,
notAfter [1] GeneralizedTime OPTIONAL
}
即私钥可以在notBefore字段和notAfter字段对应的这段时间内使用
证书策略
证书策略扩展以OID的形式来区分不同证书的安全级别
证书策略扩展的OID是{ id-ce 32} 2.5.29.32,它既可以为关键性扩展,也可为非关键性扩展
扩展值的ASN.1的描述如下:
certificatePolicies ::= SEQUENCE SIZE (1..MAX) OF PolicyInformation
PolicyInformation ::= SEQUENCE {
policyIdentifier CertPolicyId,
policyQualifiers SEQUENCE SIZE (1..MAX) OF PolicyQualifierInfo
OPTIONAL}
CertPolicyId ::= OBJECT IDENTIFIER
PolicyQualifierInfo ::= SEQUENCE {
policyQualifierId PolicyQualifierId,
qualifier ANY DEFINED BY policyQualifierId}
PolicyQualifierId ::= OBJECT IDENTIFIER
Qualifier ::=CHOICE {
cPSuri CPSuri,
userNotice UserNotice
}
CPSuri ::= IA5String
UserNotice ::=SEQUENCE {
noticeRef NoticeReference OPTIONAL,
explicitText DisplayText OPTIONAL
}
NoticeReference ::= SEQUENCE {
organization DisplayText,
noticeNumbers SEQUENCE OF INTEGER
}
DisplayText ::= CHOICE {
ia5String IA5String (SIZE(1..200))
visibleString VisibleString (SIZE(1..200))
bmpString BMPString (SIZE(1..200))
utf8String UTF8String (SIZE(1..200))
}
策略映射
策略映射扩展用来说明不同域之间证书策略的映射关系,仅存在于交叉证书中.
Policy Mappings 扩展的OID为{ id-ce 33},即2.5.29.33,一般设定为非关键性扩展
扩展值的ASN.1描述如下:
PolicyMappings ::= SEQUENCE SIZE (1..MAX) OF SEQUENCE{
issuserDomainPolicy CertPolicyId,
subjectDomainPolicy CertPolicyId
}
issuserDomainPolicy字段表示签发交叉证书的CA的策略,而subjectDomainPolicy字段表示主体CA即接受交叉CA证书的CA的策略
策略映射只是在CA之间进行,所以Policy Mappings扩展只会出现在CA证书中.
证书主体和签发者信息扩展
认证中心密钥标识
认证中心密钥标识扩展用来指定CA签发证书所用私钥对应的公钥,也就是指定了验证证书时所用的CA证书,有助于证书验证者更快地找到相应的CA证书
Authority key Identifier扩展的OID是{ id-ce 35},即2.5.29.35,一般设定为非关键性扩展
密钥标识的值通常是对CA公钥的消息摘要
主体密钥标识
主体密钥标识扩展用来区分订户的各个密钥/证书对,也就是区分各个公钥.一般情况下用订户公钥的消息摘要作为该扩展的值.
Subject Key Identifier扩展的OID为{ id-ce 14},即2.5.29.14,一般设定为非关键性扩展.
扩展值ASN.1为:
SubjectIdentifier ::= KeyIdentifier
KeyIdentifier ::= OCTER STRING
签发者其他名称
签发者名称扩展用于表示CA非X.500DN形式的身份信息和名称标识(如IP地址、电子邮件等).
Issuer Alternative Name扩展的OID是{ id-ce 18},即2.5.29.18
扩展值的ASN.1为:
IssuserAltName ::= GeneralNames
GeneralNames ::= SEQUENCE SIZE(1..MAX) OF GeneralName
GeneralName ::= CHOICE {
otherName [0] OtherName
rfc822Name [1] IA5String
dNSName [2] IA5String
x400Address [3] ORAddress
directoryName [4] Name,
ediPartyName [5] EDIPartyName,
uniformResourceIdentifier [6] IA5String,
iPAddress [7] OCTET STRING
registeredID [8] OBJECT IDENTIFIER
}
主体其他名称
在X.509证书中,订户名称也是X.500DN 来表示的.
主体其他名称扩展用于表示证书主体非X.500DN形式的身份信息和名称信息(如IP地址、电子邮件等)
Subject Alternative Name扩展的OID为{ id-ce 17 },即2.5.29.17
扩展值的ASN.1值为:
SubjectAltName ::= GeneralNames
GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName
一般为非关键性扩展
主体的目录属性
由于X.509证书来源于X.500目录,证书中可能希望带有某些X.500目录的属性信息
其用于表示证书主体在X.500目录中的属性信息,原则上可以表示任何与主体有关的信息
Subject Directory Attributes扩展的OID为 { id-ce 9},即2.5.29.9,一般设定为非关键性扩展
ASN.1:
SubjectDirectoryAttributes ::= SEQUENCE SIZE(1..MAX) OF Attribute
Attribute ::= SEQUENCE {
type AttributeType,
values SET OF AttributeValue
}
认证中心的信息获取
认证中心获取扩展用于说明如何在Internet上访问CA的相关信息
Authority Information Access扩展的OID为{ id-pe 1},即1.3.6.1.5.5.7.1.1,一般设置为非关键性扩展
ASN.1值:
AuthorityInfoAccessSyntax ::= SEQUENCE SIZE (1..MAX) OF AccessDescription
AccessDescription ::= {
accessMethod OBJECT IDENTIFIER
accessLocation GeneralName
}
accessMethod 字段表示可获取信息的类型和格式
accessLocation字段表示获取信息的位置
主体信息获取
主体信息获取扩展用于说明如何在Internet上访问证书主体的相关信息.
Subject Information Access 扩展的OID为 { ip-pe 11},即1.3.6.1.5.5.7.11.一般为非关键性扩展
ASN.1描述:
SubjectInfoAccessSyntax ::= SEQUENCE SIZE (1..MAX) OF AccessDescription
证书路径验证相关扩展
基本扩展
基本限制扩展用来区分证书是CA证书还是末端实体证书
对于CA证书,还要给出所允许的最大证书路径深度
Basic Constraints扩展的OID为{ id-ce 19 },即2.5.29.19
在CA证书中,为关键性扩展
在末端实体证书中,即可以是关键性扩展,也可以是非关键性扩展
ASN.1的值如下:
BasicConstriants ::= SEQUENCE {
cA BOOLEAN DEFAULT FALSE,
pathLenConstraint INTEGER (0..MAX)OPTIONAL
}
cA字段用来区分是CA证书还是末端实体证书
pathLenConstraint字段说明在本CA证书与末端实体之间最大的证书路径深度
名字限制
名字限制扩展用于限定CA所签发证书的命名空间,只能用于CA证书.对CA所签发的证书中的subject字段和Subject Alternative Name扩展起限制作用
Name Constraint扩展的OID为 { id-ce 30 },即2.5.29.30,通常设定为关键性扩展
ASN.1的值:
NameConstraints ::=SEQUENCE{
permittedSubtrees [0] GeneralSubtrees OPTIONAL,
excludedSubtrees [1] GeneralSubtress OPTIONAL
}
GeneralSubtrees ::= {
base GeneralName,
minimum [0] BaseDistance DEFAULT 0,
maximum [1] BaseDistance OPTIONAL
}
BaseDistance ::= INTEGER (0..MAX)
订户证书的命名必须满足CA证书的Name Constraints扩展中的多个不同类型命名的限制,否则在证书验证中,会直接认为该证书无效
策略限制
策略限制扩展用于对证书路径的策略映射过程中有关CP的处理进行限制,仅限用于CA证书
Policy Constraints扩展的OID为{ id-ce 36 },即2.5.29.36,既可以为关键性扩展也可以为非关键性扩展
ASN.1的值:
PolicyConstraints ::={
requireExplicitPolicy [0] SkipCerts OPTIONAL,
inhibitPolicyMapping [1] SkipCerts OPTIOANL
}
SkipCerts ::= INTEGER ( 0..MAX )
禁止任意策略
禁止任意策略扩展用来对Certificate Policies扩展中的Any-policy的使用进行限制,只能用于CA证书.
Inhibit Any-policy扩展的OID为是 { id-ce 54 },即2.5.29.54,通常设定为关键性扩展
Asn.1的值:
InhibitAnyPolicy ::= SkipCerts
SkipCerts ::= INTEGER(0..MAX)
表示在证书的路径中,本证书之下的多少层证书可以带有Any-policy策略
证书中CRL相关扩展
CRL分发点
CRL分发点扩展用于指明检查本证书撤销状态所需要的CRL文件可以从什么地方获取.
CRL Distribution Points扩展的OID为{ id-ce 31},即2.5.29.31,通常设定为非关键性扩展
最新CRL
最新CRL扩展用于指明在增量CRL的情况下,从哪里获取最新的增量CRL
Freshest CRL扩展的OID为 { id-ce 46},即2.5.29.46.一般设定为非关键性扩展.
CRL扩展
CRL扩展的格式与证书扩展的格式一致,同样包含了OID、扩展关键性和扩展值
CRL扩展可以分为CRL扩展和CRL Entry扩展(CRL中需要对每一个被撤销的证书分别设置扩展)
CRL的ASN.1描述:
TBSCertList ::= SEQUENCE{
version VERSION OPTIONAL
signature AlgorithmIdentifier,
issuer Name,
thisUpdate Time,
nextUpdate Time OPTIONAL,
revokedCertificates SEQUENCE OF SEQUENCE{
userCertificate CertificateSerialNumber,
revocationDate Time,
crlEntryExtensions Extensions OPTIONAL
}OPTIONAL,
crlExtensions [0] EXPLICT Extensions OPTIONAL
}
CRL扩展是对整个CRL文件的辅助信息补充,而CRL Entry扩展只是对于某一个特定Entry(被撤销证书信息)的补充说明
在同一个CRL的CRL Entry中,可以含有相同扩展OID的CRL Entry扩展.例如,对于同一个CRL的两个Entry,就可能会各自含有不同的表示证书失效日期的扩展.
- 策略映射扩展
证书策略(CP)
- 概念
指定的一组规则,这些规则表明了证书在某特定范围内和(或)某些具有相同安全需求的应用内的适合程度。CP就是通过这一组规则说明,告诉应用系统该证书(实质是证书的持有者)具有什么样的能力、什么样的可靠度、什么样的安全等级。如果都符合(或在重要的方面符合)该应用服务的需求,则该应用服务就可选择接受这个数字证书。
由CA提供,它的作用是为PKI应用系统提供特定数字证书使用上的指导。
-
基本构成
-
证书策略的表示
证书策略值的ASN.1描述如下:
CertificatePolicies ::= SEQUENCE SIZE (1...MAX) OF PolicyInformation
PolicyInformation ::= SEQUENCE{
policyIdentifier CertPolicyId,
policyQualifiers SEQUENCE SIZE(1...MAX) OF PolicyQualifierInfo OPTIONAL
}
CertPolicyId ::= OBJECT IDENTIFIER
认证业务声明(CPS)
CPS是对一些措施和实施行为的一份声明,CA通过执行这些措施和实施行为来签发、管理、撤销和更新证书;
CPS是对CP所宣称的内容的一种解释性文档,这种解释包括CA制定该CP时是经过了怎样的过程,采取了怎样的行动等,目的是让PKI系统的依赖方感觉到此CP名副其实,确实能被用到某个适宜的场合。
- CP和CPS的关系
CP和CPS都说明了PKI用户(也就是依赖方)对于证书的可信赖程度。
具体的,CP给出了证书的可信赖程度或者说是安全等级。CPS说明,为了达到相应CP的安全等级,CA方面有什么样的措施和要求。
用户应搭配CP和CPS使用。
KDC(密钥分配中心)
通过建设密钥分配中心,能够在一定程度上解决密钥交换需要机密性通道、密钥管理规模庞大复杂、未知实体间的通信困难、难以实现非否认服务的问题,在KDC结构中,每一个用户都与KDC秘密地共享一个密钥,系统所保存的密钥数量与用户数量呈线性关系,大大减少了密钥数量。在KDC的协助下,系统中两个未曾通信的实体可以进行安全的密钥交换,
KDC也带来了新的问题,KDC必须要始终在线,只要KDC不在线,实体之间就不能进行安全的密钥交换,安全通信就不能进行。
KDC单一被依靠发可能会成为通信的性能瓶颈,也是系统单点失效攻击的一个软肋。只要KDC中存在背叛或黑客,整个组织的所有机密就可能荡然无存。
由于KDC结构是基于对称密码算法的,也不能提供完善的非否认服务。
数字信封
数字信封是指发送方使用接收方的公钥来加密对称密钥后所得的数据,其目的是用来确定对称密钥传输的安全性。采用数字信封时,接受方需要使用自己的私钥才能打开数字信封得到对称密钥。
数字信封的加/解密过程大致如下:
发送方首先要获得接受方的公钥,具体如下:
1)发送方使用对称密钥对明文进行加密,生成密文信息;
2)发送方使用接受方的公钥加密对称密钥,生成数字信封;
3)发送方将数字信封和密文信息一起发送给接受方;
4)接收方收到发送方的加密信息后,使用自己的私钥打开数字信封,得到对称密钥;
5)接受方使用对称密钥对密文信息进行解密,得到最初的明文。
PKI中的实体身份鉴别
在PKI系统中,每个被鉴别的实体都应该拥有一张包含身份信息的数字证书,通过数字证书,我们可以进行更为安全的“强”鉴别.
证书基本验证
在鉴别对方身份的时候,证书可以确保对方公钥的正确性,通过对证书的验证就可以确保获得对方正确的公钥
证书的基本验证包括以下几个方面:
- CA数字签名
证书是通过CA的数字签名来保证完整性的
签发证书时,CA首先确认证书的版本号、序列号、主体、签发者、有效期、主体公钥信息以及一些扩展信息等,然后用自己的私钥和自己的签名算法,对证书中已经填入的信息进行数字签名,并把签名算法和签名结果写到待签名的证书中,就得到一份完整的数字证书.
进行证书验证时,利用CA的公钥,从证书中提取出签名算法,对证书内容进行签名验证,如果验证通过,那么就确保证书的完整性,否则说明证书是伪造或被篡改的.
- 有效期
如果当前时间在有效期内,就对证书进行其他内容的验证,否则,认为证书是无效的
- 撤销状态
证书撤销状态的查询通常可以通过下载并检查CRL或通过OCSP在线查询的方式进行
在获得一个CRL列表之后,需要验证它的数字签名,以确保CRL的权威性和完整性.
- 证书认证路径构建(证书链)
信任锚:指用户信任的起点,对它的信任不是通过信任传递而得到的,可能是通过行政命令、软件预装、合同关系、用户自主决定等方式引入.
用户验证证书就会得到一个需要验证的证书链,证书链的起点是信任锚,终点是需要验证的证书,这个证书链通常被称为证书认证路径
证书认证路径的前向构建:从待验证证书出发,一直到信任锚为止
证书认证路径的后向构建:从信任锚开始,一直到待验证证书为止
前向构建就是找出谁签发了该实体的证书
后向构建就是找出该实体给谁签发了
SSL/TLS
TLS协议是由TLS记录协议和TLS握手协议这两层协议叠加而成的.位于底层的TLS记录协议负责进行加密,而位于上层的TLS握手协议则负责除加密以外的其他各种操作.
TLS记录协议
TLS记录协议负责消息的压缩、加密以及数据的认证.
位于握手协议的下层,是负责使用对称密码对消息进行加密通信的部分.
TLS握手协议中使用了对称密码和消息认证码,但是具体的算法和共享密钥则是通过握手协议在服务器和客户端之间协商决定的.
TLS握手协议
分为4个字协议:握手协议、密码规格变更协议、警告协议、应用数据协议
握手协议
负责生成共享密钥以及交换证书
负责在客户端和服务端之间协商决定密码算法和共享密钥.基于证书的认证操作也在这个协议中完成.它是4个字协议中最复杂的一个
密码规格变更协议
负责向通信对象传达变更密码方式的信号
警告协议
负责在发生错误时将错误传达给对方
应用数据协议
将TLS上面承载的应用数据传达给通信对象的协议
PKCS系列
PKCS是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。
PKCS#7
PKCS#7叫做加密信息的语法标准,由RSA安全体系在公钥加密系统中交换数字证书产生的一种加密标准。
PKCS#7可用于加密两类数据:
1)基本数据:没有加密的数据,并且包含了的附带物如散列或数字签名。
2)增强的数据:数据已加密或包含了的附带物,或两者都有。增强的内容以一种形式压缩进另外的内容里面。
PKCS#7标准定义了多种内容类型,包括下面这些:
数据:字节或8位元组串
签名设计:随加密数据摘要一起的数据。一个信息摘要要是一个哈希算法的结果(术语摘要和散列是相同定义的)。使用信息摘要保证原始消息在传输过程中没有被篡改,并确认发送者身份。
封装数据:密文加上公钥能够解密数据。用这种方法保持消息内容对所有人保密,收件人都是信任收件人。
签名和加密数据:有公钥的加密内容和双重加密的消息摘要。
摘要数据:数据加上消息摘要
单独的加密数据:在这种情况,加密数据的公钥必须通过其他机制传输。
PKCS#10
PKCS#10是证书请求语法标准,它定义了证书请求的语法。证书请求包含了一个唯一识别名、公钥和可选的一组属性,他们一起被请求证书的实体签名(证书管理协议中的PKIX证书请求消息就是一个PKCS#10)。
国密
国密即国家密码局认定的国产机密算法,主要有SM1,SM2,SM3,SM4。
SM1为对称加密,其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用;
SM2为非对称加密,基于ECC。该算法已公开。由于该算法是基于ECC,故签名速度与密钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
SM3消息摘要,可以用MD5作为对比理解。该算法也已公开,校验结果为256位。
SM4无线局域网标准的分组数据算法,对称加密,密钥长度和分组长度均为128位。
由于SM1、SM4加解密的分组大小为128bit,故对消息进行加解密时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。
SM2
SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,包括SM2-1椭圆曲线数字签名算法,SM2-2椭圆曲线密钥交换协议,SM2-3椭圆曲线公钥加密算法,分别用于实现数字签名密钥协商和数据加密等功能。SM2算法与RSA算法不同的是,SM2算法是基于椭圆曲线上点群离散对数难题,相对于RSA算法,256位的SM2密码强度已经比2048位的RSA密码强度要高。
SM3
SM3杂凑算法是我国自主设计的密码扎凑算法,使用于商用密码应用中的数字签名和验证信息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如MD5输出128比特杂凑值,输出长度太短,影响其安全性。SHA-1算法的输出长度为160比特,SM3算法的输出长度为256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法。
SM4
SM4分组密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。要保证一个对称密码算法的安全性的基本条件就是其具备足够的密钥长度,SM4算法与AES算法具有相同的密钥长度,分组长度128比特,因此在安全性上高于3DES算法。
密钥管理系统
PKI系统是面向大规模用户的、基于公钥密码算法的安全系统。所以在系统中会有大量的密钥管理工作。密钥管理过程包括密钥的生成、备份、托管和恢复。
KMC(密钥管理中心)
- 密钥生成
KMC批量生成密钥对,把生成的待使用的密钥对批量交给CA,由CA分配后再将这个绑定关系报告给KMC
-
密钥存储
- 待用库:用于存放等待使用的密钥对;
- 在用库:用于存放当前使用的密钥对;
- 历史库:用于存放过期或已撤销的密钥对;
-
密钥分发
KMC不面向订户,只面向CA,KMC通过CA分发密钥;
-
密钥恢复
建立KMC的主要目的就是为了密钥恢复
-
密钥撤销、更新和归档
-
密钥恢复:当证书到期、用户需要或管理机构认为必要时,KMC根据CA的请求撤销订户当前使用的密钥;
-
密钥更新:当证书到期或订户需要时,KMC根据CA的请求为订户生成新的密钥对;
-
密钥归档:密钥撤销或更新后,对于不再使用的密钥,KMC不能立即删除,而应转入历史库安全存储足够长的时间;
-
随机数
盐
盐是由伪随机数生成器生成的随机数
盐是用来防御字典攻击的
字典攻击是一种事先进行计算并准备好候选密钥列表的方法
使用随机数的密码技术
下面的场景使用到随机数
- 生成密钥
用于对称密码和消息认证码
- 生成密钥对
用于公钥密码和数字签名
-
生成初始化向量IV
用于分组密码的CBC、CFB和OFB模式
-
生成nonce
用于防御重放攻击以及分组密码的CTR模式等
-
生成盐
用于基于口令的密码(PBE)
随机性的性质
- 随机性-----不存在统计学偏差,是完全杂乱的散列
- 不可预测性------不能从过去的数列推测出下一个出现的数
- 不可重现性------除非将数列本身保存下来,否则不能重现相同的数列