《应用密码学》——基本协议(笔记)

目录

  • 三、基本协议
    • [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 中间人攻击

针对于 公开密钥密码系统的秘钥交换的攻击,我们可以客户端与服务端之间截获信息的方式进行。

  1. 服务端将公开秘钥发送给客户端
  2. 攻击者在网络链路中截获信息,并将自己的公钥发给客户端
  3. 客户端用收到的公钥加密会话秘钥或其他信息后发送给服务端
  4. 攻击者截获后,用自己私钥进行解密,随后再用服务端的公钥加密发送给服务端

3.1.4 连锁协议(interlock protocol)

该协议可以解决中间人攻击

  1. A将自己的公钥给B
  2. B将自己的公钥给A
  3. A用B的公钥加密消息,并将加密消息的一半传给B
  4. B用A的公钥加密消息,并将加密消息的一半传给A
  5. 随后A将另一半加密消息发给B
  6. B将两次的消息合成一个,然后就可以解密了,解密成功后,再将另一半加密消息发送给A
  7. A将两次的消息合成一个,然后就可以解密了

通过该方法,即使中间人截获了消息,他也没办法进行解密操作,只能虚构一条消息,加密后发送一半的消息。这样会导致整个消息都是错的,业务错误。

3.1.5 使用数字签名的秘钥交换

即在通讯中进行签名,这样就保证了信息来源的正确性。在通信双方私钥不丢失的情况下,攻击者是无法做到假冒任何一个人。

3.1.6 密钥和消息传输

  1. A 产生随机会话密钥 K K K并用 K K K加密 M M M: E K ( M ) E_K(M) EK(M)
  2. A用B的公开密钥加密 K K K: E B ( K ) E_B(K) EB(K)
  3. B用私钥解密: D B ( K ) D_B(K) DB(K)
  4. 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,单项函数鉴别仍有严重安全问题:用户到主机之间介入的数据通道的任何人都可以读取其口令。

于是可以用私钥加密,公钥解密的方式完成。

  1. 主机给用户A发送一段消息
  2. A用私钥加密消息发送给主机
  3. 主机用A的公开密钥解密,判断解密后的消息与自己发给A的消息是否一致

由于私人密钥又长又难记,因此多为硬件或者通信软件自动处理。那么就需要要求这个终端是可信的。

用户也可以用自己的私钥计算后给主机,主机使用用户的公开密钥进行验证,通过该方式可以阻止对协议的攻击。

3.2.5 使用连锁协议互相鉴别

设想如下场景:

A与B是想要互相鉴别的两个用户,双方都有一个对方知道的口令:A对应 P A P_A PA,B对应 P B P_B PB。

  1. A与B互相交换公开密钥
  2. A用B的公开密钥加密 P A P_A PA发送给B,B用A的公开密钥加密 P B P_B PB发送给A
  3. 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。

  1. A选用随机数 R A R_A RA(RIPE文件规定是64位数),并将它发给B

  2. 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(消息)计算出来的

  3. 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互相鉴别。增加了如下流程:

  1. A将 H K H_K HK( R B R_B RB、A)发送给B
  2. 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(假设为仲裁者)共享一个秘密密钥。该密钥只用于分配,不用于加密用户之间的实际消息。

  1. 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)
  2. 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(假设为仲裁者)共享一个秘密密钥。

  1. A将自己的名字与随机数 R A R_A RA连在一起发给B:
    M A = A , R A M_A=A,R_A MA=A,RA
  2. 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)
  3. 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生成的本次的会话密钥

  1. 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)

  2. 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(假设为仲裁者)共享一个秘密密钥。

  1. 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生成的随机数

  2. 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间的秘密密钥加密的行为。

  1. A解密并提取 K K K,并确认 R A R_A RA。随后转发 E B C ( K , A ) E_{BC}(K,A) EBC(K,A)给B
  2. 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)
  3. 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)
  4. 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:

  1. M 发给B:
    M M = E B ( K , A ) M_M=E_B(K,A) MM=EB(K,A)
  2. 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)
  3. M截获后,发送给B
    M M 1 = E K ( R B − 1 ) M_{M1}=E_K(R_B-1) MM1=EK(RB−1)
  4. 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协议的增强。

  1. A发给B:
    M A = A , R A M_A=A,R_A MA=A,RA
  2. 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)
  3. 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)
  4. 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)
  5. 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(假设为仲裁者)有他们公开密钥签名的副本。

  1. A发给T消息为B的名字:
    M A 1 = B M_{A1}=B MA1=B

  2. 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)

  3. 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))
  4. 收到消息后,B 发送给T消息为A的名字
    M B 1 = A M_{B1}=A MB1=A

  5. 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)

  6. 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)),随后用自己的私钥解密等等。

  7. B发送给A
    M B 2 = E K ( T B ) M_{B2}=E_K(T_B) MB2=EK(TB)

  8. A 验证即可

补充

密码算法分类

按照技术特征分类可以分为如下三类:

  • 对称算法(对成密码)
  • 非对称算法(公开密钥密码)
  • 摘要算法(单向函数)

分组密码算法的工作模式

可以参考密码学 - 分组密码的工作模式

分组密码算法是一种对称加密算法,广泛应用于数据保护领域。它将明文分成固定长度的分组,对每个分组进行加密或解密操作。

分组密码算法的主要特点是安全性高、加密速度快,适用于大规模数据的加密。

复制代码
初始化向量 (IV)
一组称为初始化向量 (IV) 的比特,用于混合加密。确保每次相同明文的每次加密结果都不同,与密钥不同,IV 不需要保密。
  1. ECB(电子密码本,Electronic Code Book):每个分组独立进行加密和解密计算,导致相同的明文总是产生相同的密文。可并行,但是一个密文错误会影响整个明文分组、同步错误不可恢复。
  2. CBC(密码分组链接,Cipher Blick Chaining):在加密当前分组前,将上一个分组的加密结果与当前明文分组进行异或后进行加密,形成密文链。一个密文错误会影响整个明文分组以及下一个分组的相应位、同步错误不可恢复。
  3. 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级联则是最后的密文,解密则为逆向过程。

一个密文错误会影响整个明文分组以及下一个分组的相应位、同步错误可恢复

  1. 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的记录数据。

  1. 接收上层应用数据
  2. 对数据进行分段,长度不超过 16 K B 16KB 16KB。记录层不关心消息边界(即,半包或粘包)
  3. 使用当前会话中定义的压缩算法对明文块记录进行压缩(可选)。压缩使用无损压缩,压缩后增加长度不能超过 1024 B 1024B 1024B
  4. 对第3步结果使用当前会话中定义的MAC算法和MAC密钥计算MAC值,并加到第3步结果的后面
  5. 对第4步结果用加密算法进行加密,加密内容增长不可超过 1024 B 1024B 1024B
  6. 将第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

本例子为单向认证模式:客户端校验服务端证书。(双向认证即服务端还要检验客户端的证书)

  1. 客户端将自己使用的协议版本号、支持的加密算法和生成的随机数(Client random)发给服务端,同时SSL消息为ClientHello
  2. 服务器返回选中的加密算法和自己的公钥证书以及一个随机数(Server random),同时SSL消息为SeverHello。
    • 有些服务器将该步骤拆分为多个步骤,分为发送证书和发送选中的加密套件压缩方法等,以SeverHello为开始,以为SeverDone为结束
  3. 客户端对服务器证书进行验证(是否为可信机构的数字签名),无误后抽取公开密钥,生成随机数PreMaster secret后用公钥加密。完成后发给服务器,SSL消息为Client Key Exchange
  4. 发送ChangeCipherSpec消息,更新用于当前连接的密码组(告知服务器自己后续消息进行加密)
  5. 服务器收到消息后,自己根据两个随机数(Client random与Server random)+解密出来的PreMaster secret依照约定好的算法,生成对称密钥和MAC密钥(客户端则是在第3步发送消息后生成)。
  6. 服务器发送ChangeCipherSpec消息,表示自己可以接受加密信息了。
  7. 客户端将所有握手信息的MAC值加密后发给服务端,SSL消息为Client Finished
  8. 服务器验证通过后,发送ChangeCipherSpec更新用于当前连接的密码组(告知客户端自己后续消息进行加密)
  9. 服务器将所有握手信息的MAC值加密后发给客户端,SSL消息为Server Finished

完整的流程图如下(含双向认证)

警告协议

再通信过程发现的任何一场,都需要发给对方一条警示消息通告。

  1. Fatal错误,多为需要中断会话的错误
  2. 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】《商业银行密码技术应用》张明德 李伟斌 朱立军 李澜涛

相关推荐
蒙奇D索大4 小时前
【数据结构】数据结构秘籍:如何衡量“查找”的快慢?ASL是关键!
数据结构·笔记·学习·考研
蒙奇D索大4 小时前
【数据结构】考研重点掌握:顺序查找算法实现与ASL计算详解
数据结构·笔记·学习·考研·算法·改行学it
能不能别报错5 小时前
K8s学习笔记(十一) service
笔记·学习·kubernetes
悠哉悠哉愿意5 小时前
【ROS2学习笔记】服务
开发语言·笔记·学习·ros2
东方芷兰7 小时前
LLM 笔记 —— 01 大型语言模型修炼史(Self-supervised Learning、Supervised Learning、RLHF)
人工智能·笔记·神经网络·语言模型·自然语言处理·transformer
zhangrelay11 小时前
ROS2学习研究版本推荐:Jazzy Jalisco(LTS长期支持版)AI版本251001
笔记·学习
大白的编程日记.12 小时前
【Linux学习笔记】线程概念和控制(二)
linux·笔记·学习
克里斯蒂亚诺更新13 小时前
OpenSSL 3.0对某些加密算法增加了限制
笔记
随机惯性粒子群14 小时前
STM32控制开发学习笔记【基于STM32 HAL库】
笔记·stm32·嵌入式硬件·学习