Lauren: 我思考了一下,采用消息认证码的手套订单还是有问题。客户生成订单,计算Hash值,并且给Hash值加密。这样防止了篡改和别人伪造,但是因为密码是在工厂与客户之间共享的。客户和工厂都有生成一模一样订单的能力。客户否认说我没有发过这个订单,是工厂自己伪造的订单。技术上来讲,消息认证码没有办法防止否认。
Haorui: 正确,我们在讲对称加密算法的时候说过,万一密钥泄露,通信双方都有嫌疑。
Lauren: 应该有一个唯一性的东西,也就是说,能够证明只有其唯一身份的东西,就像现实社会中的签名,一旦一个文件有某个人的签名,他就没有办法否认这个事情。
Haorui: 想起一个故事,明朝的时候,有位地方官员举报一位贪官。但是不巧的是,弹劾的奏章被贪官的同党给截获了。
Lauren: 我猜贪官会伙同同党把奏章销毁掉。
Haorui: 事情并没有那么简单,很多官员都知道有这么一个奏章存在,只是对内容情况不清楚。
Lauren: 那就更改奏章,把原来的奏章销毁,再伪造一封。
Haorui: 这个更难了,这位地方官员是相当有名的书法家,他的书法被称之为------“王氏书法”,他的书法造诣上举世无双,伪造他的奏章一眼就被识破。他的笔迹就是最好的签名。
Lauren: 呵呵,因为他的书法“举世无双”。他的字迹具备唯一性,见字如见人。可以用来作身份识别。
Haorui: 对了。在现代计算机密码学中,也要解决身份识别的问题。我们学的东西中,什么具备唯一性呢?
Lauren: 只有非对称密码系统中的私钥是唯一的。
Haorui: 正确,如果我们把消息认证码中的对称加密换成非对称加密码,如何?
Lauren: 不行,非对称密码算法用公钥加密,私钥解密。而公钥是可以被公开的,也就是说,可以被多人知道,因此,没有办法作身份鉴别。
Haorui: 我的意思是倒过来用,即,用私钥加密,用公钥解密。
Lauren: Interesting!私钥是唯一的,只要用对应的公钥能解密的文件,必然说明这个文件一定是私钥拥有者加过密的。也就是说,只有看到“王氏书法”就可以推断这个奏章出去王姓的地方官员。
Haorui: 这个就是我们今天要讲的数字签名,HASH算法+非对称加密算法。注意与非对称加密算法不同的是,它用私钥加密,用公钥解密。更专业的说法是,用私钥签名,用公钥进行验证签名,见图9-1。
我们再看看具体的流程,与消息认证码的流程相相似。见图9.2:
- 首先,客户共享公钥给工厂,私钥自己保密。
- 客户生成订单,计算HASH值并用自己的私钥加密得到签名,然后将订单与签名一起发给工厂。
- 工厂对订单计算HASH值并与通过对接收到的签名解密得到的HASH值对比。
- 两个HASH值相同,则证明订单发自特定的一个合法的客户。
Lauren: 数字签名最大的特性就是利用了私钥的私密性,所以私钥一定要保护好。
Haorui: 数字签名使用的私钥类似于你企业的公章,签名相当于盖章。与真实的签名一样受法律保护,有相关的立法支持。
Lauren: 数字签名有有效期吗?
Haorui: 有的,在签名的时候,可能附上有效期等相关信息。今天无法破解的密钥,不代表将来不会,随着科技的发展,计算机算力的增加。私钥也可能被破解,所有有效期是必须的。