数字签名
1. 数字签名
数字签名相当于现实世界中的盖章、签名的功能在计算机世界中进行的技术实现。使用数字签名可以识别篡改和伪装,还可以防止否认。
生成消息签名的行为称为签名,验证消息签名的行为称为验签。
2. 从消息认证码到数字签名
消息认证码双方共享密钥,消息可能是任何一方发送,对于第三方不能证明消息的来源。
数字签名通信双方使用的密钥不同,签名和验签的密钥不同,可以判断消息来源是否是签名密钥产生,防止抵赖。
3. 公钥密码与数字签名
数字签名技术对签名密钥和验证密钥进行了区分,使用验证密钥无法生成签名。
签名密钥只能由签名的人持有,验签密钥是任何需要验证签名的人持有。
以上数字签名的特性与公钥密码类似,数字签名就是把公钥证书“反过来使用”而实现的。
公钥证书:公钥用于加密,私钥用于解密。
数字签名:私钥用于签名,公钥用于验签。
4. 数字签名的实现方法
直接对消息签名。比较容易理解,但一般不这样使用。
① Alice用自己的私钥对消息进行加密。
② Alice将消息和签名发送给Bob。
③ Bob用Alice的公钥将收到的签名解密。
④ Bob将签名解密后的消息与Alice发送过来的消息进行对比,完成验签。
对消息的散列值进行签名。较为复杂,但实际场景中都这样使用。
① Alice用单向散列函数计算消息的散列值。
② Alice用自己的私钥对散列值进行加密。
③ Alice将消息和签名发送给Bob。
④ Bob用Alice的公钥对收到的签名解密。
⑤ Bob将签名解密后的散列值与Alice直接发送过来的消息散列值进行对比。
5. 数字证书的应用实例
安全信息公告:发布漏洞信息等,没必要对消息进行加密,防止恶意修改,对明文消息签名,叫做明文签名。
软件下载:防止软件被篡改,Android中无法安装没有签名的软件。
公钥证书:把公钥当做消息,对它加上数字证书。得到公钥证书。
SSL/TLS:SSL/TLS认证服务器身份是否是合法时,会使用服务器证书,即加上了数字签名的服务器公钥。
6. RSA实现数字签名
单向散列函数与RSA结合起来进行数字签名的详细说明,见RFC3447。
用RSA生成签名:签名 = 消息^D mod N D和N是签名者的私钥
用RSA验证签名:签名后的消息 = 签名^E mod N E和N是签名者的公钥
7. 其他的数字签名
ElGamal、DSA、ECDSA、Rabin
8. 对数字签名的攻击
① 中间人攻击:
攻击者介于发送者和接受者之间,无需破解数字签名算法前提下完成攻击。
解决方案是公钥证书,即证书。
② 单向散列函数的攻击:
使用的单向散列函数必须抗碰撞性。
③ 利用数字签名攻击公钥密码:
把“请将消息签名”理解为“请解密消息”,即利用数字签名解密。
解决:首先不要直接对消息进行签名,对散列值签名比较安全。
其次公钥密码和数字签名最好使用不同的密钥对;
人为地:不对消息不清楚的消息进行签名。
④ 潜在伪造:
用RSA来解密消息的数字签名算法中,潜在伪造是可能的。
RSA公钥是可以获得的,因此对数字签名进行潜在的伪造也就可以实现。
⑤ 其他攻击
被用于公钥密码的攻击,大部分都能被用于攻击数字签名。
9. 密码技术对比
① 消息认证码和数字签名
② 混合密码系统与对散列值签名:对称密码的密钥是机密性的精华,单向散列函数的散列值是完整性的精华。
③ 数字签名无法解决的问题:数字签名既能识别出篡改和伪装,还可以防止否认。问题是用于验证签名的公钥属于真正的发送者。需要数字证书技术。
10. 数字签名的疑问
- 密文并非被用于保证机密性,而是被用于代表一种只有持有该密钥的人才能够生成的信息,这样的信息被称为认证符号,消息认证码、数字签名都是认证符号。
- 数字签名不能保证机密性,数字签名的作用本来就不是保证机密性。
- 签名可以被复制,签名是不是原件并不重要,真正重要的是特定密码的签名者与特定的消息都绑在了一起。
- 签名之后也可以对消息和签名进行修改,但是这样修改后,验证签名就会失败。数字签名所要实现的并不是防止修改,而是识别修改。
- 不能修改消息和签名,使验签可以成功。只要有一比特被修改,重新计算的散列值就会有很大的改变,不知道私钥,就无法产生改私钥对应的密文。
- 防止否认,数字签名可以防止否认,能够生成签名的密钥,只有发送者才持有。

浙公网安备 33010602011771号