本章学习的内容
数字签名相当于现实世界中的盖章,数字签名可以识别篡改和伪装还可以防止否认
数字签名
从消息认证码到数字签名
消息认证码的缺陷:
由于共享一个秘钥,所以无法防止否认,也无法第三方认证。
通过数字签名解决问题
通过发送者和接受者使用不同的秘钥可以解决以上的问题
实际上数字签名就是把公钥加密反过来用。
发送者拥有一个自己的秘钥,认证者则使用公钥进行认证。
签名的生成和验证
- 生成消息签名的行为
- 验证消息签名的行为
生成消息签名行为是发送者做的,而验证数字签名则是验证者执行的。
数字签名通过对签名秘钥,和验证秘钥进行了区分,验证秘钥无法生成签名,而签名秘钥只由签名的人持有,验证秘钥则是任何需要验证签名的人可以持有。
这和公钥密码很类似。
公钥密码是分为加密秘钥和解密秘钥,加密秘钥无法解密,解密秘钥只由解密人持有,加密秘钥是任何需要加密的人可以持有。
公钥密码和数字签名
而数字签名中,私钥加密相当于生成签名,公钥解密则相当于验证签名。
数字签名的方法
- 直接对消息签名的方法
- 对消息的散列值签名的方法
对消息签名的方法比较容易理解,但是实际不会使用,而对散列值签名的方法复杂一些,实际中我们都会有这个方法
直接对消息签名的方法
对消息散列值进行签名的方法
从时间轴上看是这样的:
对数字签名的疑问
密文为什么能作为签名使用
问:私钥加密消息得到签名,然后用公钥解密消息验证,但是密文为何具备签名的意义?
答:数字签名需要没有私钥的人无法生成密文的性质来实现,所以密文并非保证机密性而是代表只有持有该秘钥的人才能生成这样的信息。
这样的信息称为认证符号。
数字签名不能保证机密性吗
问:消息未加密就发送了,不就无法保证机密性吗
答:确实不保证,但是可以不直接发送消息,加密之后再发送
这种签名可以随意复制吗
问:数字签名只不过是数据,可以容易复制,但是如果可以轻易复制出相同的内容还叫签名吗
答:虽然叫签名,但是这个消息意味着特性的签名者和特定的消息绑定在了一起,所以无论复制多少份,谁对这份消息进行了签名的事实无法改变
消息内容会不会被任意修改
问:数字签名只不过是普通的数据,消息和签名是可以任意修改的,这样的签名还有意义吗
答:签名后可以对消息和签名修改,但是修改之后验证签名会失效。数字签名实现的不是防止修改而是识别修改
问:能不能同时修改签名保证成功呢
答:无法做到,散列值无法简单对应
签名会不会被重复使用
问:如果得到了某人的签名,应该可以把签名的部分提取出来放在其他消息后,这样签名还有效吗
答:签名验证会失效
删除签名也无法作废合同吗
问:如果是纸质结局4,原件撕毁可以作废,但是数字签名的借据只是计算机文件,删除也无法保证已经作废,因为不知道有没有副本。是否不方便?
答:带有数字签名的借据即便删除也无法作废,要作废带有数字签名的借据可以重新创建一份相当于收据的文书,并让对方进行数字签名。
如何防止否认
问:数字签名为何可以防止否认
答:因为只有持有私钥者可以产生签名,所以无法否认。虽然如果数字签名生成者说秘钥被盗可以否认,但是也有办法。在第十章会讲到。
数字签名能够代替签名吗
问:纸质借据不签名盖章会不放心,数字签名真的可以代替现实世界的签名和盖章吗
答:数字签名虽然可以对数据签名,但是还是有不安的因素,因为签订合同是社会性行为,如果计算机上的软件不可信或者病毒,就有可能会有风险。
数字签名的应用实例
安全信息公告
我们需要发布安全信息公告的时候为了防止有人伪装成该组织,所以为进行数字签名,明文本身无需加密。这种一般称为明文签名。
软件下载
公钥证书
SSL/TLS
通过RSA实现数字签名
用RSA生成签名
利用以下公式表述生成签名的过程
$签名 = 消息^D mod N$
用RSA验证签名
$由签名求得的消息 = 签名^E mod N$
其他数字签名
Elgamal方式
DSA
ECDSA
Rabin方式
对数字签名的攻击
中间人攻击
对接受者伪装成发送者就可以无需破解数字签名的前提下完成攻击。
通过证书我们可以规避这个问题,保证公钥的正确性。
对单项散列值的攻击
数字签名的单项散列函数必须有抗碰撞性,否则攻击者可以生成另外一条不同的消息进行绑定
利用数字签名攻击公钥密码
攻击者将密文作为签名发送,如果将内容签名,则可以破解密文。
所以不要对意思不清楚的消息进行签名。
潜在伪造
如果一个没有私钥的攻击者可以对有意义的消息进行合法的数字签名,这个数字签名算法一定是不安全的。
即使签名的对象是无意义的消息,如果攻击者可以生成合法的数字签名,则说明这个签名算法有威胁,称为潜在伪造。
其他攻击
针对公钥密码的大部分攻击可以用于攻击数字签名。
各种密码技术对比
消息认证码与数字签名
混合密码系统与对散列值签名
理论上都是对消息的压缩:
- 秘钥是机密性的精华
- 散列值是完整性的精华
数字签名无法解决的问题
公钥必须属于真正的发送者,否则即使数字签名算法再强大,公钥是伪造的,数字签名也会完全失效。为了确认公钥是否合法,我们需要证书。
为了构造可信的数字签名链条,我们需要让公钥以及数字签名技术成为一种社会性的基础设施:公钥基础设施(Public Key Infrastructure,PKI)