对数字签名的攻击

一 中间人攻击

对数字签名的中间人攻击,具体来说就是主动攻击者Mallory介入发送者和接收者的中间,对发送者伪装成接受者,对接收者伪装成发送者,从而能够在无需破解数字签名算法的前提下完成攻击。

要防止中间人攻击,就需要确认自己得到的公钥是否真的属于自己的通信对象。例如,我们假设Bob需要确认自己所得到的是否真的是Alice的公钥,Bob可以给Alice打个电话,问一下自己手上的公钥是不是真的(如果电话通信也被Mallory控制,那这个方法就行不通了)。

要在电话中把公钥的内容都念一遍实在是太难了,这里有一个简单的方法,即Alice和Bob分别用单向散列函数计算出散列值,然后在电话中相互确认散列值的内容即可。实际上,涉及公钥密码的软件都可以显示公钥的散列值,这个散列值称为指纹。指纹的内容就是像下面这样的一串字节序列。

二 对单向散列函数攻击

数字签名中所使用的单向散列函数必须具备抗碰撞性,否则攻击者就可以生成另外一条不同的消息,是其与签名绑定的消息具有相同的散列值。

三 利用数字签名攻击公钥密码

在RSA中,生成签名的公式是:

签名 = 消息的D次方 mod N

这个公式和公钥密码的解密操作是等同的,也就是说可以将“请对消息签名”这一请求理解为“请解密消息”。利用这一点,攻击者可以发动一种巧妙的攻击,即利用数字签名来破译密文。

我们假设现在Alice和Bob正在通信,主动攻击者Mallory正在窃听。Alice用Bob的公钥加密消息后发送给Bob,发送的密文是用下面公式计算出来的。

密文 = 消息的E次方 mod N

Mallory窃听到Alice发送的密文并将其保存下来,由于Mallory想要破译这段消息,因此它给Bob写了这样一封邮件。

对数字签名的攻击_第1张图片

Mallory将刚刚窃听到的密文作为上述邮件的附件一起发送给Bob,即:

附件数据 = 密文

Bob看到了Mallory的邮件,发现附件中的数据的确只是随机数据(但其实这是Alice用Bob的公钥加密的密文)。

于是Bob对附件数据进行签名

签名= 附件数据 的D次方 mod N

       = 密文的D次方 mod N

       = 消息

Bob的本意是对随机的附件数据施加数字签名,但结果却无意中解密了密文。如果不小心将上述签名的内容(=消息)发送给Mallory,那么Mallory不费吹灰之力就可以破译密文了。这种诱使接收者本人来解密的方法实在是非常大胆。

对于这样的攻击,我们应该采取怎样的对策呢?首先,不要直接对消息进行签名,对散列值进行签名比较安全;其实,公钥密码和数字签名最好分别使用不同的密钥对。

然而,最重要的是绝对不要对意思不清楚的消息进行签名,尤其是对看起来只是随机数据的消息进行签名。从签名的目的来说,这一点应该是理所当然的,因为谁都不会在自己看不懂的合同上签字盖章的。

你可能感兴趣的:(安全)