安全握手的陷阱

tech2023-10-06  91

安全握手的陷阱(Security Handshake Pitfall),这些发生在握手阶段,完成握手有两种方案,即单向认证(one-way authentication)和双向认证(mutual authentication)。

1.单向认证

单向认证的思想很简单。如果有两个用户A和B进行身份认证,其中B要对A进行身份认证,但A不需要认证B。实现这种类型的认证的方法有多中,比较知名的有:只登陆(login only)、共享密钥(shared secret)和单向公钥(one-way public key)。

1.1 只登陆认证

在这种简单的方法中:(1)用户A以明文的形式把它的用户名和和密码发送给另一个用户B。(2)B验证该用户名和密码,如果该用户名和密码正确,就可以在A和B之间进行通信,不需要用其他的加密形式加密或完整性检验。 这种方法实现起来很简单,也很好理解。但是,不是很有效,需要更好的认证机制,其中A把口令的消息摘要,而不是初始口令发送给B,口令加密是另一种方法。

1.2 共享密钥的方法

这里假定用户A和B在实际的通信开始之前,已经协商好了一个共享对称密钥KAB。因此,对这种方法取名为共享密钥。该方法的工作如下所示: 1.A发送其用户名和口令给B。 2.B创建一个随机挑战R,并将它发送给A。 3.A用A与B之间的共享密钥KAB加密该随机挑战R,并把已加密的R发送给B。B也用相同的共享的密钥KAB加密初始随机挑战R。如果这个已加密的随机挑战与A发送的匹配,那么B就认为A是合法的,即A通过了B的认证。 但是,这里存在一个问题,这是一个单向认证,即B认证A,但A不能认证B,因此攻击者C可以发送一个旧的随机挑战R给A。在A用KAB加密R,并把它发送回C后,只需忽略它即可。于是,A错误地认证C就是B。也就是说,C可以装扮成B,并与A进行通信。 这种协议有一个变体,B不是把随机挑战R发送给A,而是用共享密钥KAB将它加密后,把这个已加密的随机挑战发送给A。A把已加密的随机挑战解密,从而获得初始的未加密的随机挑战R,并把它发送回B,以认证自己。 基本的共享密钥认证方案还有另一种变体,它只要求一个从A到B的消息,不需要随机挑战。A只需要共享对称密钥KAB加密当前的时间戳,并把这个已加密的时间戳发送给B。B将它解密,如果是所期望的,则B通过A的认证。为此,A和B需要预先同步化它们的时间戳。这种协议有一定的优点,该协议很容易实现,以替代发送明文口令,A往B发送的不是用户名和明文口令了,而是用户名和已加密的当前时间戳。

1.3 单向公钥的方法

前面的协议是基于共享秘密,即共享对称密钥KAB,如果攻击者能读取B的数据库,那么它就可以访问该密钥KAB,那么它就非常容易地伪装为A来与B进行通信。如果用公钥来替换共享密钥,那么就可以避免这些。这里的思想很简单:(1)A发送其用户名给B;(2)B发送随机挑战R给A;(3)A用它的私钥加密该随机挑战R,并把它发送给B,B使用A的公钥解密这个加密的随机挑战,并把它与初始随机挑战R进行匹配。 也可以稍作修改,如下所示: 1.A发送其用户名给B; 2.B生成一个随机挑战R,用A的公钥加密该随机挑战。B把已加密的随机挑战发给A; 3.A用它的私钥将已加密的随机挑战解密,并把它发送给B。B将它与初始的随机挑战R匹配。 上述方案都存在一些问题,需要强行规定签名密钥必须与加密密钥不同,即,每个用户必须有两个公钥-私钥对,一对用户签名和验证,另一对用于加密和解密。

2.双向认证

在双向认证中,A和B相互认证对方,因此这里为双向认证。该方法也可以以不同的方式来实现:共享秘密和基于时间戳的方法。

2.1 共享秘密的方法

该方法假设A和B具有一个共享对称密钥KAB,其工作步骤如下: 1.A发送其用户名给B; 2.B发送随机挑战R1给A; 3.A用KAB加密随机挑战,并把它发送给B; 4.A发送另一个不同的随机挑战R2给B; 5.B用KAB加密R2,并把它发送给A。 此时,B像以前那样认证A,A也要认证B,因此这是双向认证,如下图所示: 可以看到,这里需要交换很多消息,使得其方法效率低。可以减少到只有3条消息,把更多的消息放置在这3条消息中。修改的方法如下所述: 1.A发送用户名和随机挑战R2给B; 2.B用共享对称密钥加密KAB加密R2,生成一个新的随机挑战R1,并把这两个随机挑战发给A; 3.A验证R2,用共享对称密钥KAB加密R1,并把它发送给B。B验证R1。 该过程如下图所示: 这种方法把消息数量减少为3了,但是,它容易受到反射攻击法攻击。假设C想伪装为A与B通信,首先,攻击者C开始如下步骤: 1.C往B发送一个含有A的用户名和随机挑战R2的消息; 2.B用共享对称密钥KAB加密R2,生成一个新的随机挑战R1,并把这两个随机挑战发送给C,此时B以为以为是在发送给A。 攻击者不能用KAB加密R1。但是C让B加密了R2。现在,攻击者C打开与B的另一会话,该会话与第一个不同,第一个会话仍是活动的,此时,攻击者执行如下步骤: 1.C发送一个含有A的用户名和随机挑战R1; 2.B用共享对称密钥KAB加密R1,生成一个新的随机挑战R3,并把这两个随机挑战发送给C,B以为他是发送给A了。 然后,C可以回到第一个会话,由于第一个会话,C有了用KAB加密的R1,C把R1发送给B,就完成了验证。 要解决这种反射攻击,一种思想是使用不同的密钥(假如KAB和KBA)。当A要加密发送给B的内容时使用KAB,当B要加密发送给A的内容时使用KBA。这样,B就不能用KAB来加密R1。这就意味着C不能像反射攻击那样在随后误用它了。

2.2 公钥的方法

双向认证也可以使用公钥技术来完成。如果A和B知道了对方的公钥,要完成双向认证过程需要3个消息,如下所示: 1.A把它的用户名和用B的公钥加密的随机挑战R2发送给B; 2.B用它的私钥把随机挑战R2解密。B创建一个新的随机挑战R1,并用A的公钥加密,B把这两个随机挑战(已解密的R2和已加密的R1)发送给A; 3.A用它的私钥把随机挑战R1解密,并把它发送给B,B验证R1。 同样,这种方法有一个变体,如下所示: 1.A发送它的用户名和R2给B; 2.B用它的私钥加密R2,并把它和R1发送给A; 3.A为R1签名后返回给B。

2.3 基于时间戳的方法

通过时间戳,而不是像随机挑战之类的随机数,可以把双向认证的过程减少为只有两步。其工作过程如下所示: 1.A把它的用户名和用共享密钥KAB加密后的当前时间戳发送给B; 2.B通过用KAB把上面的数据解密来获得时间戳,并把该时间戳加1。B用KBA将这个结果加密,并把它与它的用户名发送给A。

最新回复(0)