目录
- 三、基本协议
-
- [3.1 密钥交换](#3.1 密钥交换)
-
- [3.1.1 对称密码系统的秘钥交换](#3.1.1 对称密码系统的秘钥交换)
- [3.1.2 公开密钥密码系统的秘钥交换](#3.1.2 公开密钥密码系统的秘钥交换)
- [3.1.3 中间人攻击](#3.1.3 中间人攻击)
- [3.1.4 连锁协议(interlock protocol)](#3.1.4 连锁协议(interlock protocol))
- [3.1.5 使用数字签名的秘钥交换](#3.1.5 使用数字签名的秘钥交换)
- [3.1.6 密钥和消息传输](#3.1.6 密钥和消息传输)
- [3.1.7 密钥与消息广播](#3.1.7 密钥与消息广播)
- [3.2 鉴别](#3.2 鉴别)
-
- [3.2.1 使用单向函数鉴别](#3.2.1 使用单向函数鉴别)
- [3.2.2 字典式攻击和salt](#3.2.2 字典式攻击和salt)
- [3.2.3 SKEY](#3.2.3 SKEY)
- [3.2.4 使用公开密码系统鉴别](#3.2.4 使用公开密码系统鉴别)
- [3.2.5 使用连锁协议互相鉴别](#3.2.5 使用连锁协议互相鉴别)
- [3.2.6 SKID](#3.2.6 SKID)
- [3.2.7 消息的鉴别](#3.2.7 消息的鉴别)
- [3.3 鉴别与交换](#3.3 鉴别与交换)
-
- [3.3.1 Wide-Mouth Frog协议(对称密钥)](#3.3.1 Wide-Mouth Frog协议(对称密钥))
- [3.3.2 Yahalom协议(对称密钥)](#3.3.2 Yahalom协议(对称密钥))
- [3.3.3 Needham-Schroeder协议(对称密钥)](#3.3.3 Needham-Schroeder协议(对称密钥))
- [3.3.4 Neuman-Stubblebine协议(对称密钥)](#3.3.4 Neuman-Stubblebine协议(对称密钥))
- [3.3.5 DASS协议(公开密钥+对称密码)](#3.3.5 DASS协议(公开密钥+对称密码))
- 补充
- 参考文献
三、基本协议
3.1 密钥交换
3.1.1 对称密码系统的秘钥交换
该协议假设网上的用户每人与密钥分配中心(Key Distribution Center,KDC)共享一个秘密秘钥。在协议开始前,这些秘钥必须在适当的位置。
该方式最大的问题就是如何进行秘钥交换,其次KDC必须保证自己的安全,即他可以明确知道所有业务的信息,同时如果KDC失败了,系统就会被破坏。
3.1.2 公开密钥密码系统的秘钥交换
公开密钥多用于加密会话秘钥,通过该方式安全的将会话秘钥进行交换。
3.1.3 中间人攻击
针对于 公开密钥密码系统的秘钥交换的攻击,我们可以客户端与服务端之间截获信息的方式进行。
- 服务端将公开秘钥发送给客户端
- 攻击者在网络链路中截获信息,并将自己的公钥发给客户端
- 客户端用收到的公钥加密会话秘钥或其他信息后发送给服务端
- 攻击者截获后,用自己私钥进行解密,随后再用服务端的公钥加密发送给服务端
3.1.4 连锁协议(interlock protocol)
该协议可以解决中间人攻击
- A将自己的公钥给B
- B将自己的公钥给A
- A用B的公钥加密消息,并将加密消息的一半传给B
- B用A的公钥加密消息,并将加密消息的一半传给A
- 随后A将另一半加密消息发给B
- B将两次的消息合成一个,然后就可以解密了,解密成功后,再将另一半加密消息发送给A
- A将两次的消息合成一个,然后就可以解密了
通过该方法,即使中间人截获了消息,他也没办法进行解密操作,只能虚构一条消息,加密后发送一半的消息。这样会导致整个消息都是错的,业务错误。
3.1.5 使用数字签名的秘钥交换
即在通讯中进行签名,这样就保证了信息来源的正确性。在通信双方私钥不丢失的情况下,攻击者是无法做到假冒任何一个人。
3.1.6 密钥和消息传输
- A 产生随机会话密钥 K K K并用 K K K加密 M M M: E K ( M ) E_K(M) EK(M)
- A用B的公开密钥加密 K K K: E B ( K ) E_B(K) EB(K)
- B用私钥解密: D B ( K ) D_B(K) DB(K)
- B用 K K K解密消息: D K ( M ) D_K(M) DK(M)
同时,可以通过对 E K ( M ) E_K(M) EK(M)进行签名,来确保身份正确。
3.1.7 密钥与消息广播
即用每个参与的人的公钥分别对原消息进行加密后传输。
3.2 鉴别
3.2.1 使用单向函数鉴别
即计算机只需要将用户输入的值计算后进行存储,下一次用户再次输入时,将计算后的值与存储值比较即可。此外,因为计算使用的算法不可逆的,因此无法通过存储值逆向出原来的输入值。
3.2.2 字典式攻击和salt
使用单项函数加密的口令文件还是很脆弱,通过将常用口令用单向函数计算后,与存储加密口令的文件比较。这种方式就是字典式攻击(dictionary attack)。
salt(盐)是一个随机字符串,将它与口令连接在一起再用于单向计算,则可以减少被命中的概率。如果salt的范围足够大,就消除了对常用口令的字典式攻击。即,攻击者不得不考虑每个可能的salt值的单向散列值。
3.2.3 SKEY
使用者输入随机数 R R R,计算机使用固定算法计算约100次后,输出一个列表,使用者把这些数保管起来,计算机也存储起来。
登录时,使用者输入用户名和列表中的最后一个数,计算机也将用户名和对应列表最后一个数进行匹配,如果均匹配得上,则登录通过。同时,最后一个数不可以再使用,它被取消了,下次登陆则需要使用倒数第二个数。下一次登录时输入倒数第二个数后,它也被取消了,之后再用倒数第三个数。
即,每次登录使用的数是列表中未被取消的最后数,每次登录后取消列表中当前未被取消的最后数。用完了所有数后,重新初始化。
3.2.4 使用公开密码系统鉴别
即使使用salt,单项函数鉴别仍有严重安全问题:用户到主机之间介入的数据通道的任何人都可以读取其口令。
于是可以用私钥加密,公钥解密的方式完成。
- 主机给用户A发送一段消息
- A用私钥加密消息发送给主机
- 主机用A的公开密钥解密,判断解密后的消息与自己发给A的消息是否一致
由于私人密钥又长又难记,因此多为硬件或者通信软件自动处理。那么就需要要求这个终端是可信的。
用户也可以用自己的私钥计算后给主机,主机使用用户的公开密钥进行验证,通过该方式可以阻止对协议的攻击。
3.2.5 使用连锁协议互相鉴别
设想如下场景:
A与B是想要互相鉴别的两个用户,双方都有一个对方知道的口令:A对应 P A P_A PA,B对应 P B P_B PB。
- A与B互相交换公开密钥
- A用B的公开密钥加密 P A P_A PA发送给B,B用A的公开密钥加密 P B P_B PB发送给A
- A与B分别用私钥解密,并验证是否正确
如果此时有一个攻击者C,在第一步中介入,用自己的公开密钥代替A给B以及B给A的密钥,那么在步骤2中:A用C的公开密钥加密 P A P_A PA发给B,C截获后用自己的私钥解密 P A P_A PA,再用B的公钥加密 P A P_A PA发给B,此时C获取到了 P A P_A PA的值。同理,可以获取到 P B P_B PB,但是A与B并不知道。
如果我们使用了连锁协议就可以解决这个问题。([3.1.4 连锁协议(interlock protocol)](#3.1.4 连锁协议(interlock protocol)))
3.2.6 SKID
SKID2与SKID3时为RACE的RIPE项目开发的对称密码识别协议。使用MAC(Message Authentication Code,消息鉴别码)提供安全性。
SKID2允许B向A证明他的身份。假设A与B共享密钥 K K K。
-
A选用随机数 R A R_A RA(RIPE文件规定是64位数),并将它发给B
-
B选用随机数 R B R_B RB(RIPE文件规定是64位数),并将 R B R_B RB和 H K H_K HK( R A R_A RA、 R B R_B RB、B)发给A。其中 H K H_K HK是MAC,它是通过 R A R_A RA、 R B R_B RB、B(消息)计算出来的
-
A计算 H K H_K HK( R A R_A RA、 R B R_B RB、B),并将它与B哪里得到的消息比较,如果一致,则证明了B的身份(A通过 R A R_A RA、 R B R_B RB、B计算出 H K H_K HK,并与B发过来的 H K H_K HK比较)。
SKID2允许A与B互相鉴别。增加了如下流程:
- A将 H K H_K HK( R B R_B RB、A)发送给B
- B计算 H K H_K HK( R B R_B RB、A)并将它与A的消息比较,证明A的身份。
此外,MAC仅能保证消息不被篡改,不能进行消息的加密。
3.2.7 消息的鉴别
B从A得到消息时,如何确定是否可信?A对它的消息进行签名,那么就可以保证其消息的可信,同时也让任何人都相信消息可信。(公开密码系统)
对称密码学的鉴别仅能保证共享密钥的参与者可以知道消息可信,但是参与者并不能靠共享密钥知道消息来自于谁。
如果消息没有被加密,那么也可以使用MAC的方式保证信息可信,但与对称密码学有相同问题(本质共享了MAC密钥)。
- 公开密码系统鉴别:数字签名,包括数据的完整性、真实性和不可抵赖性。提供最高的安全性保证。相比于MAC,更侧重身份验证。
- MAC(消息鉴别码):验证数据的完整性和真实性,即判断数据是否被篡改或伪造。
- HMAC(Keyed-Hashing for Message Authentication):MAC的一种实现,可以验证数据完整性,也可以验证数据是由原始发送方发出的。基于摘要算法。
- CBC-DEC-MAC:MAC的一种实现,基于DES/3DES对称算法。
- MD(消息摘要,MD码,Message digest):验证数据的完整性和唯一性。
3.3 鉴别与交换
3.3中的协议综合利用密钥交换和鉴别,解决了一般计算机问题:如何交换密钥与如何确定双方的身份。
3.3.1 Wide-Mouth Frog协议(对称密钥)
一个简单的对称密钥管理协议,协议使用一个可信服务器。A与B两人分别与C(假设为仲裁者)共享一个秘密密钥。该密钥只用于分配,不用于加密用户之间的实际消息。
- A将时间标记 T A T_A TA与B的名字 B B B与随机会话密钥 K K K一起,用A和C的共享密钥对整个消息加密。随后A将加密的消息与她的身份 A A A一起发给了C:
M A = A , E A ( T A , B , K ) M_A=A,E_A(T_A,B,K) MA=A,EA(TA,B,K) - C解密A的消息,然后将一个新的时间标记 T B T_B TB与A的名字 A A A和随机会话密钥一起,用他与B的共享密钥对整个消息加密,并发给B:
M C = E B ( T B , A , K ) M_C=E_B(T_B,A,K) MC=EB(TB,A,K)
C通过A的身份 A A A,采用对应的密钥解开了信息,确定了A的身份。解密后的明文告知了C要用B的密钥发给B。B采用对应的密钥解开了信息,并确定了发送信息人的身份A和密钥 K K K。
链路为:A->C->B
这个协议最重要的假设是A完全有能力产生好的会话密钥。
3.3.2 Yahalom协议(对称密钥)
在该协议中,A与B两人分别与C(假设为仲裁者)共享一个秘密密钥。
- A将自己的名字与随机数 R A R_A RA连在一起发给B:
M A = A , R A M_A=A,R_A MA=A,RA - B将 M A M_A MA和自己的随机数 R B R_B RB一起用与C的共享密钥 E B C E_{BC} EBC加密。再将加密结果与自己的名字发给C:
M B = B , E B C ( M A , R B ) M_B=B,E_{BC}(M_A,R_B) MB=B,EBC(MA,RB) - C解密后,产生两个消息发给A:
M C 1 = E A C ( B , K , R A , R B ) M_{C1}=E_{AC}(B,K,R_A,R_B) MC1=EAC(B,K,RA,RB)
M C 2 = E B C ( A , K ) M_{C2}=E_{BC}(A,K) MC2=EBC(A,K)
其中, E A C E_{AC} EAC为用AC间的秘密密钥加密的行为, K K K为C生成的本次的会话密钥
-
A解密后从 E C 1 E_{C1} EC1提取 K K K(会话密钥),校验 R A R_A RA是否正确,然后发送两个消息给B:
M A 1 = E K ( R B ) M_{A1}=E_{K}(R_B) MA1=EK(RB)
M A 2 = M C 2 = E B C ( A , K ) M_{A2}=M_{C2}=E_{BC}(A,K) MA2=MC2=EBC(A,K) -
B 解密 M A 2 M_{A2} MA2,提取 K K K,在解密 M A 1 M_{A1} MA1,校验 R B R_B RB
链路为A->B->C->A->B,其中会话密钥由C生成,且由接收方调用C,C仅发送一次消息给A。
3.3.3 Needham-Schroeder协议(对称密钥)
在该协议中,A与B两人分别与C(假设为仲裁者)共享一个秘密密钥。
-
A发给C:
M A = A , B , R A M_A=A,B,R_A MA=A,B,RA其中, A A A与 B B B为A与B的名字, R A R_A RA为A生成的随机数
-
C生成会话密钥 K K K。并发给A如下消息:
M C = E A C ( R A , B , K , E B C ( K , A ) ) M_C=E_{AC}(R_A,B,K,E_{BC}(K,A)) MC=EAC(RA,B,K,EBC(K,A))
其中, E A C E_{AC} EAC与 E B C E_{BC} EBC分别为用AC、BC间的秘密密钥加密的行为。
- A解密并提取 K K K,并确认 R A R_A RA。随后转发 E B C ( K , A ) E_{BC}(K,A) EBC(K,A)给B
- B解密并提取 K K K,生成 R B R_B RB后,发送给A:
M B = E K ( R B ) M_B=E_K(R_B) MB=EK(RB) - A解密后,产生 R B − 1 R_B-1 RB−1并用 K K K加密,发送给B:
M A 1 = E K ( R B − 1 ) M_{A1}=E_K(R_B-1) MA1=EK(RB−1) - B解密后,验证 R B − 1 R_B-1 RB−1
链路为:A->C->A->B->A->B
防止重放攻击
为什么要有 R A R_A RA、 R B R_B RB、 R B − 1 R_B-1 RB−1?
主要是用来防止重放攻击(replay attack)。
- 第2步中,C发给A的消息中有 R A R_A RA,使得A认为消息来自于C。随机数 R A R_A RA使得A知道这个是新消息。
- 第5步中,A发给B的消息中有 R B − 1 R_B-1 RB−1,使得B认为消息来自于A。随机数 R B − 1 R_B-1 RB−1使得B知道这个是新消息。
但是,这样做仍然有漏洞。
如果攻击者M可以存取旧的密钥 K K K,他就可以发动攻击。M记录步骤3中,A发给B的消息,然后一旦他有 K K K,他就可以假装自己是A:
- M 发给B:
M M = E B ( K , A ) M_M=E_B(K,A) MM=EB(K,A) - B 提取 K K K生成 R B R_B RB,并发送给A
M B 1 = E K ( R B ) M_{B1}=E_K(R_B) MB1=EK(RB) - M截获后,发送给B
M M 1 = E K ( R B − 1 ) M_{M1}=E_K(R_B-1) MM1=EK(RB−1) - B验证后,确信M就是A
一个使用时间标记更强的协议可以击败该攻击,在步骤2中,发送如下消息:
M C 1 = E A C ( R A , B , K , E B C ( K , A , T ) ) M_C1=E_{AC}(R_A,B,K,E_{BC}(K,A,T)) MC1=EAC(RA,B,K,EBC(K,A,T))
其中, T T T为时间戳。
但是,许多时间标记的方式依赖于系统的时钟同步。如果时钟不同步(系统缺陷或者由于被破坏),那么大多数的使用时间标记的协议都可能受到攻击,这种方式叫隐瞒重放(suppress-reply)。
此外,如果A与C的秘密密钥泄露了,后果非常严重。
3.3.4 Neuman-Stubblebine协议(对称密钥)
Neuman-Stubblebine协议是针对隐瞒重放(suppress-reply)攻击的反击,该协议为 Yahalom协议的增强。
- A发给B:
M A = A , R A M_A=A,R_A MA=A,RA - B发给C:
M B = B , R B , E B C ( A , R A , T B ) M_B=B,R_B,E_{BC}(A,R_A,T_B) MB=B,RB,EBC(A,RA,TB) - C产生两个消息给A:
M C 1 = E A C ( B , R A , K , T B ) M_{C1}= E_{AC}(B,R_A,K,T_B) MC1=EAC(B,RA,K,TB)
M C 2 = E B C ( A , K , T B ) M_{C2}= E_{BC}(A,K,T_B) MC2=EBC(A,K,TB) - A解密 M C 1 M_{C1} MC1,提取 K K K,验证 R A R_A RA,后发送给B如下消息:
M A 1 = E K ( R B ) M_{A1}=E_{K}(R_B) MA1=EK(RB)
M A 2 = M C 2 = E B C ( A , K , T B ) M_{A2}=M_{C2}= E_{BC}(A,K,T_B) MA2=MC2=EBC(A,K,TB) - B在解密 M A 2 M_{A2} MA2后,检验自己的 T B T_B TB,通过后用提取的 K K K解密 M A 1 M_{A1} MA1的 R B R_B RB即可。
由于 T B T_B TB都是B自己的时间,所以不需要同步时钟。
3.3.5 DASS协议(公开密钥+对称密码)
分布式鉴别安全协议(Distributed Authentication Security Service,DASS)。
A与B各有一个私人密钥,T(假设为仲裁者)有他们公开密钥签名的副本。
-
A发给T消息为B的名字:
M A 1 = B M_{A1}=B MA1=B -
T把B的公开密钥 K B K_B KB发给A,并用自己的私人密钥 T T T签了名。签名内容为:
M T 1 = S T ( B , K B ) M_{T1}=S_T(B,K_B) MT1=ST(B,KB) -
A验证T的签名,随后她产生 K K K(随机会话密钥)与 K P K_P KP(公开&私人密钥对)。
- K K K加密时间标记,私钥 K A K_A KA对 K K K的寿命周期 L L L、自己的名字和 K P K_P KP进行签名。
- 用B的公钥加密 K K K,再用 K P K_P KP进行签名
- 最后发送给B如下消息:
M A 2 = E K ( T A ) , S K A ( L , A , K P ) , S K P ( E K B ( K ) ) M_{A2}=E_K(T_A),S_{K_A}(L,A,K_P),S_{K_P}(E_{K_B(K)}) MA2=EK(TA),SKA(L,A,KP),SKP(EKB(K))
-
收到消息后,B 发送给T消息为A的名字
M B 1 = A M_{B1}=A MB1=A -
T把A的公开密钥 K A K_A KA发给B,并用自己的私人密钥 T T T签了名。签名内容为:
M T 2 = S T ( A , K A ) M_{T2}=S_T(A,K_A) MT2=ST(A,KA) -
B验证T的签名,随后用A的公钥验证A的签名 S K A ( L , A , K P ) S_{K_A}(L,A,K_P) SKA(L,A,KP),并拿到 K P K_P KP后校验 S K P ( E K B ( K ) ) S_{K_P}(E_{K_B(K)}) SKP(EKB(K)),随后用自己的私钥解密等等。
-
B发送给A
M B 2 = E K ( T B ) M_{B2}=E_K(T_B) MB2=EK(TB) -
A 验证即可
补充
密码算法分类
按照技术特征分类可以分为如下三类:
- 对称算法(对成密码)
- 非对称算法(公开密钥密码)
- 摘要算法(单向函数)
分组密码算法的工作模式
可以参考密码学 - 分组密码的工作模式
分组密码算法是一种对称加密算法,广泛应用于数据保护领域。它将明文分成固定长度的分组,对每个分组进行加密或解密操作。
分组密码算法的主要特点是安全性高、加密速度快,适用于大规模数据的加密。
初始化向量 (IV)
一组称为初始化向量 (IV) 的比特,用于混合加密。确保每次相同明文的每次加密结果都不同,与密钥不同,IV 不需要保密。
- ECB(电子密码本,Electronic Code Book):每个分组独立进行加密和解密计算,导致相同的明文总是产生相同的密文。可并行,但是一个密文错误会影响整个明文分组、同步错误不可恢复。
- CBC(密码分组链接,Cipher Blick Chaining):在加密当前分组前,将上一个分组的加密结果与当前明文分组进行异或后进行加密,形成密文链。一个密文错误会影响整个明文分组以及下一个分组的相应位、同步错误不可恢复。
- CFB(密码反馈,Cipher Feed-Back):
假设 n n n位长的队列,其初始值为 I V IV IV(n位),将明文消息分为若干个 x x x位长的比特块 t t t( x ∈ [ 1 , n ] x \in [1,n] x∈[1,n]),对每个 t t t进行如下操作:
- 用密钥 K K K对队列进行加密,得到 n n n位长的密文
- 将密文左边 x x x位与 t t t进行异或,得到了 t t t的密文 C C C
- 将 C C C放入队列右端,丢弃队列左边 x x x位
将所有的 C C C级联则是最后的密文,解密则为逆向过程。
一个密文错误会影响整个明文分组以及下一个分组的相应位、同步错误可恢复
- OFB(输出反馈,Output Feed-Back):类似于CFB,
假设 n n n位长的队列,其初始值为 I V IV IV(n位),将明文消息分为若干个 x x x位长的比特块 t t t( x ∈ [ 1 , n ] x \in [1,n] x∈[1,n]),对每个 t t t进行如下操作:
- 用密钥 K K K对队列进行加密,得到 n n n位长的密文 c c c
- 将 c c c左边 x x x位与 t t t进行异或,得到了 t t t的密文 C C C
- 将 c c c左边 x x x位放入队列右端,丢弃队列左边 x x x位
将所有的 C C C级联则是最后的密文,解密则为逆向过程。
一个密文错误仅影明文的相应位、同步错误不可恢复
SSL协议
SSL/TLS(Secure Socket Layer/Transport Layer Security) 协议:TLS v1.0协议建立于SSL v3.0协议上,又称SSL V3.1协议。TLS v1.0提供了支持SSL v3.0协议的机制。(现几乎都使用TLS,且TLS v1.0已不安全,使用的是更高版本)
SSL与TLS 协议:提供端到端的数据保密和完整性及通信双方认证服务。它于应用层协议独立无关,高层协议(HTTP、FTP、TELNET)可以透明的建立于SSL之上。
它由两层协议组成:
- 握手协议(Handshake Protocol)
- 改变密码约定协议(Change Cipher Spec Protocol)
- 警告协议(Alert Protocol )
- 应用数据协议(Application Data Protocol)
- 记录协议(Record Protocol)
|------|------|----------|--------|
| 握手协议 | 警告协议 | 改变密码约定协议 | 应用数据协议 |
| 记录协议 ||||
记录协议
提供两个服务:机密性和消息完整性服务。机密性是通过加密数据来实现的,而消息完整性是通过计算和验证消息认证码(MAC)来保证的。
所有的传输数据都被封装在记录中。组成:记录头+长度不为0的记录数据。
- 接收上层应用数据
- 对数据进行分段,长度不超过 16 K B 16KB 16KB。记录层不关心消息边界(即,半包或粘包)
- 使用当前会话中定义的压缩算法对明文块记录进行压缩(可选)。压缩使用无损压缩,压缩后增加长度不能超过 1024 B 1024B 1024B
- 对第3步结果使用当前会话中定义的MAC算法和MAC密钥计算MAC值,并加到第3步结果的后面
- 对第4步结果用加密算法进行加密,加密内容增长不可超过 1024 B 1024B 1024B
- 将第5步结果添加在记录头中
记录头:内容类型( 8 b i t 8bit 8bit,即上层四个协议:application_data、alert、handshake、change_cipher_spec),SSL协议版本号和长度域( 16 b i t 16bit 16bit)
握手协议
用于建立对话。
参考SSL/TLS原理详解和SSL Introduction with Sample Transaction and Packet Exchange
本例子为单向认证模式:客户端校验服务端证书。(双向认证即服务端还要检验客户端的证书)
- 客户端将自己使用的协议版本号、支持的加密算法和生成的随机数(Client random)发给服务端,同时SSL消息为ClientHello
- 服务器返回选中的加密算法和自己的公钥证书以及一个随机数(Server random),同时SSL消息为SeverHello。
- 有些服务器将该步骤拆分为多个步骤,分为发送证书和发送选中的加密套件压缩方法等,以SeverHello为开始,以为SeverDone为结束
- 客户端对服务器证书进行验证(是否为可信机构的数字签名),无误后抽取公开密钥,生成随机数PreMaster secret后用公钥加密。完成后发给服务器,SSL消息为Client Key Exchange
- 发送ChangeCipherSpec消息,更新用于当前连接的密码组(告知服务器自己后续消息进行加密)
- 服务器收到消息后,自己根据两个随机数(Client random与Server random)+解密出来的PreMaster secret依照约定好的算法,生成对称密钥和MAC密钥(客户端则是在第3步发送消息后生成)。
- 服务器发送ChangeCipherSpec消息,表示自己可以接受加密信息了。
- 客户端将所有握手信息的MAC值加密后发给服务端,SSL消息为Client Finished
- 服务器验证通过后,发送ChangeCipherSpec更新用于当前连接的密码组(告知客户端自己后续消息进行加密)
- 服务器将所有握手信息的MAC值加密后发给客户端,SSL消息为Server Finished
完整的流程图如下(含双向认证)
警告协议
再通信过程发现的任何一场,都需要发给对方一条警示消息通告。
- Fatal错误,多为需要中断会话的错误
- Warning错误,不对通讯造成影响,双方通常只是记录日志
改变密码约定协议
由单个消息组成,只包含一个值为1的单个字节。该消息唯一作用就是将未决状态复制为当前状态。
应用数据协议
数据本身使用的协议,比如超文本传输协议(Hyper-Text Transfer Protocol,HTTP)、文件传输协议(File Transfer Protocol,FTP)等。
IPSec协议
在IP层(网络层)对数据报文进行高强度的安全处理。包括访问控制,数据源认证,抗重播保护和有限传输流保密性。
它是一个协议簇(一些网络协议的集合)包括:AH、ESP、IKE协议等。
- ESP(Encapsulating Security Payload,封装安全载荷):将整个IP分组或将上层协议(传输层)部分封装到一个ESP载荷中,然后对此载荷进行安全处理(加密/鉴别)。
- AH(Authentication Header,验证报文头):主要为通信提供完整性校验和加密与抗重放攻击。
它可以分为:
- 传输模式:保护IP报文头之后的上层协议与数据
- 隧道模式:保护整个IP报文分组,它会在外部IP报文头和内部报文头间插入一个IPSec报文头,保护内部子网地址(VPN网络就是隧道模式)。
ESP报文
ESP报文头可以分为如下结构:
|------------------|
| 安全参数索引(SPI) |
| 序列号 |
| 有效负载 |
| 填充字节(填充长度、下一报文头) |
| 验证数据(变长) |
传输模式封装后为:
|---------|--------|----------|----|--------|-------|
| 原始IP报文头 | ESP报文头 | TCP(UDP) | 数据 | ESP报文尾 | ESP验证 |
ESP报文头-ESP报文尾为验证区域
TCP(UDP)-ESP报文尾为加密区域
隧道模式封装后为:
|--------|--------|---------|----------|----|--------|-------|
| 新IP报文头 | ESP报文头 | 原始IP报文头 | TCP(UDP) | 数据 | ESP报文尾 | ESP验证 |
ESP报文头-ESP报文尾为验证区域
原始IP报文头-ESP报文尾为加密区域
AH报文
AH报文头可以分为如下结构:
|--------|--------|----|
| 下一个报文头 | 有效负载长度 | 保留 |
| 安全参数索引(SPI) |||
| 序列号 |||
| 验证数据(变长) |||
传输模式封装后为:
|---------|-------|----------|----|
| 原始IP报文头 | AH报文头 | TCP(UDP) | 数据 |
原始IP报文头-数据为验证区域
隧道模式封装后为:
|--------|-------|---------|----------|----|
| 新IP报文头 | AH报文头 | 原始IP报文头 | TCP(UDP) | 数据 |
新IP报文头--数据为验证区域
AH与ESP的隧道模式联合嵌套
AH与ESP隧道模式的联合嵌套使用:
|--------|-------|--------|---------|----------|----|--------|-------|
| 新IP报文头 | AH报文头 | ESP报文头 | 原始IP报文头 | TCP(UDP) | 数据 | ESP报文尾 | ESP验证 |
金融密钥管理技术
ANSI X9.17规范中定义了金融机构密钥的一个基本分类机制。
- 数据密钥(Data Key):工作密钥,直接为信息系统提供数据保密的密码计算功能
- 密钥加密密钥(Key Encrypting Key):传输主密钥,本身不参与对数据的保密计算,用于保护数据密钥分发时的传输安全。
各种密钥管理体系可以统一为三层密钥管理体系:
本地主密钥:LMK 传输主密钥:ZMK 传输主密钥:TMK 工作密钥:ZAK 工作密钥:ZPK 工作密钥:TAK 工作密钥:TPK
- LMK:Local Master Key,整个安全体系中最高层级密钥,用来机密本地存放的其他密钥以及操作员权限控制信息
- 传输主密钥:分为区域主密钥ZMK(Zone Master Key)与终端主密钥TMK(Terminal Master Key)。
- ZMK用于总行、分行、支行、网点等两个区域共享网络之间加密工作密钥
- TMK用于银行系统与各种终端设备(ATM、POS)本地网络之间加密工作密钥
- 工作密钥:工作密钥种类繁多
- TPK:Terminal PIN Key,用于本地网络中,加密本地网络内终端与终端数据受理者之间传送的用户密码
- TAK:Terminal Authentication Key,用于本地网络中,本地网络内终端与终端数据受理者之间传送时,生成和校验消息认证码
- ZPK: Zone PIN Key,用于共享网络中,加密在两个通信节点之间传送的用户密码
- ZAK:Zone Authentication Key,用于本地网络中,在两个通信节点之间传送时,生成和校验消息认证码
参考文献
【1】《应用密码学》【美】布鲁斯·施奈
【2】《商业银行密码技术应用》张明德 李伟斌 朱立军 李澜涛