数字签名(Digital Signature)是电子签名(Electronic Signature)的一种(实现)。
目前电子签名签名的实现方式有:
基于PKI(Public Key Infrastructino)的公钥密码技术的数字签名;
以生物特征统计学为基础的识别标识;
手印、声音印记或视网膜扫描的识别;
一个让收件人能识别发件人身份的密码代号、密码或个人识别码PIN;
基于量子力学的计算机...
数字签名的目的和功能:
认证、数据保密性、数据完整性和不可否认性.
数字签名的实现方式:
(一)公钥加密算法如何加密:
比如我要发送一个绝密的信息M给你,我当然不会直接把M写在信里面寄给你,我会提前告诉你解密的方法,然后使用算法P处理M得到P(M),我发送P(M)给你.因为你知道解密的方法P',你使用P'来处理P(M)得到了M.只要P和P'不让别人知道,我们的通讯就是保密的.
如果从P'能够得到P,那你就能知道P,然后伪装我发送消息给其他人.
但是据说有一个公钥加密算法,加密和解密的算法是一样的,而且是公开的,我告诉你我的公钥k1,我自己保密的是私钥k0,我发送给你的信息是M' = P(k0,M),你收到M'后可以通过运算P(k1,M')得到M,但是通过k1是无法计算出k0的,通过K0也无法计算出k1.(我也不知道是否真的这么神奇,现在网络上到处都是RSA被破解之类的,看得菜鸟我心惊胆颤,俺刚要好好学习呢,别人早已经把它颠覆了).
这样你只有解密的份,没有伪装我身份的可能.
同样你也可以用k1来加密发消息给我,我用k0可以将它解密.
但是这种公钥加密算法是把消息本身当成一个大数来进行幂运算,所以比如我想把1000个字节的字符串当成一个大数来加密,应该是非常困难而且非常慢的.(偶想高手应该会算,但那不是俺关心的)
所以有了散列.
(二)关于散列:
最常用的散列机制有 SHA1,MD5,RIPEMD-160等.SHA1即“安全散列算法”。SHA1 可以处理 2**64字节以内的任何消息,并生成一个 20 字节的结果。
按照菜鸟我看来这不是"散列",这是"聚列"啊.把一个2^(64*8)的数映射到一个2(20*8)的数,同志们,这不是聚列是什么?但其实我们一般用的字符串,不会把0~2^(64*8)的数全用光,只用了其中一小部分.所以这个散列似乎是相对安全的.这种问题就留给长了几个脑袋的人来解决吧.
关键是散列算法比公钥加密算法要快很多.
这样,我找到了一对公钥和私钥(k0和k1),我公布了我的散列算法H,发表了一篇长5万个字奇菜无比的论文,内容为M,对M进行散列,很快得到H(M),然后用私钥加密得到S = P(k0,H(M)),把S附在M后面并发表.
你看到后为了证实这篇其烂无比的文章是我写的,可以判断 P(k1,S) 是否等于H(M).如果相等,你就可以确定这其烂无比的文章确实是我写的.
或者确定那个狗屁不通的审批确实是某大人批准的.
(三)除了使用公钥加密算法来实现数字签名,还可以用HMAC来实现:
HMAC即散列后的消息验证代码”(Hashed Messsage Authentication Code)
微软MSDN上这么说:
将共享密钥混合在摘要中,即创建 H(S+M)。您收到消息后,可以使用自己的 S 副本来创建 H'(S+M)。
在使用 HMAC 时,完整性保护的有效性取决于攻击者计算出 S 的能力。因此,S 应该不容易被猜出,并应该经常更改 S。符合以上要求的最好方法之一是使用 Kerberos。在 Kerberos 中,中央机构将在两个实体希望通信时分配包含临时会话密钥的“票”。此会话密钥将用作共享密钥。在要将签名发送给您时,我将得到一张票,以和你通信。我打开票中的属于我的那一部分来获得 S,然后将消息、消息的 HMAC 和票中您的那一部分发送给您。您打开票(使用原来通过 Kerberos 注册的密钥),获取 S 以及有关我身份的信息。您现在可以获得消息 M,生成自己的 H'(S+M),并查看它们是否匹配。如果匹配,表明您原封不动地收到了我的消息,并且 Kerberos 将通知您我是谁。
Kerberos是古希腊神话里的地域门口的一条三头狗.也是MIT麻省理工大学发明的一种协议.要使用这个协议需要配置一个分发服务器,似乎比较麻烦...