在讲数字前面以前,我们先要了解一下哈希函数
1 哈希函数 HashHash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
哈希表中元素是由哈希函数确定的。将数据元素的关键字K作为自变量,通过一定的函数关系(称为哈希函数),计算出的值,即为该元素的存储地址。表示为:
Addr = H(key)
Hash函数H将可变长度的数据块M作为输入,产生固定长度的Hash值h = H(M)。
称M是h的原像。因为H是多对一的映射,所以对于任意给定的Hash值h,对应有多个原像。如果满足x≠y且H(x)=H(y),则称为碰撞。
哈希函数的构造方法有很多,参见:
1.2 哈希函数在密码学的应用其可以用于验证数据的完整性,即判断数据是否被篡改过。
2 数字签名数字签名是哈希函数的一大应用。
2.1 基本的签名–认证流程哈希函数是一种“压缩函数”,利用哈希函数可以把任意长度的输入经由散列函数算法变换成固定长度的输出,该输出的哈希值就是消息摘要,也称数字摘要。在正式的数字签名中,发送方首先对发送文件采用哈希算法,得到一个固定长度的消息摘要( Message Digest);再用自己的私钥( Secret key,SK)对消息摘要进行签名,形成发送方的数字签名。数字签名将作为队件和原文一起发送给接收方;接收方首先用发送方的公钥对数字签名进行解密得到发送方的数字摘要,然后用相同的哈希函数对原文进行哈希计算,得到一个新的消息摘要,最后将消息摘要与收到的消息摘要做比较。
下图展示的数字签名的操作过程:
鲍勃有两把钥匙,一把是公钥,另一把是私钥。
鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。
苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。
鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。
鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用Hash函数,生成信件的摘要(digest)。
然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature)。
鲍勃将这个签名,附在信件下面,一起发给苏珊。
苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。
苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。
复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成"数字签名",写信给苏珊,让苏珊用假的鲍勃公钥进行解密。
后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找"证书中心"(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。数字证书包含有BOB的公匙以及证书的相关信息,只有CA的公钥才可以解开。
认证中心一般由政府出资建立。每个实体都有CA 发来的证书(certificate),里面有公钥及其拥有者的标识信息。此证书被 CA 进行了数字签名。任何用户都可从可信的地方获得认证中心 CA 的公钥,此公钥用来验证某个公钥是否为某个实体所拥有。有的大公司也提供认证中心服务。
鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。
苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,公钥用来解密数字签名,得到摘要1,对比明文(文件)进行hash函数生成摘要2,对比这两个摘要,就能证明"数字签名"是否真的是鲍勃签的。
概括一下,就是:
1.首先,用户A向证书颁发机构提交个人信息,申请证书。通过CA审核后,CA生成用户A的证书,证书中包括了A的公钥和私钥还有CA的数字签名。证书颁发机构CA本身拥有一对密钥,这是对CA所颁发的证书进行数字签名和保密的基础,绝不能泄露。
2.用户A收到的证书中包括了带有CA数字签名的,专属A公钥和私钥,CA的数字签名确保了别人不能伪造用户A的公钥和私钥。
3.同时,用户B也必须信任给用户A颁发证书的第三方认证机构CA,即用户B拥有CA颁发的"CA公钥"。
4.通信时,用户A向用户B发送的数据包中的"加密的摘要"上有用户A的数字签名,“A公钥” 上有认证机构CA的数字签名。用户B收到数据包之后,先要验证收到的 “A公钥”
是否来源合法:是认证机构颁发的带有CA签名的公钥吗?用户B并不信任用户A,但是用户B信任第三方认证机构CA。所以,用户B先使用证书颁发机构颁发的
“CA公钥” 验证收到的 “A公钥” 是否由同一认证机构颁发,是否在颁发之后更改过。
5.验证通过后,用户B便相信收到的 “A公钥” 确实来自真实的用户A。随后再使用 “A公钥” 对 “加密的摘要” 进行解密,进行上文提到的对比操作,以判断文件是否更改。
下面,我们看一个应用"数字证书"的实例:https协议。这个协议主要用于网页加密。
首先,客户端向服务器发出加密请求。
服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。
客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。
如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。
如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。
1.数字签名可以防止数据被伪造。其他人不能伪造对消息的签名,因为私有密钥只有签名者自己知道,所以其他人不可以构造出正确的签名结果数据。
2.数字签名可以防止数据被篡改。数字签名与原始文件或摘要一起发送给接收者,一旦信息被篡改,接收者可通过计算摘要和验证签名来判断该文件无效,从而保证了文件的完整性。
3.数字签名可以防止数据抵赖。数字签名即可以作为身份认证的依据,也可以作为签名者签名操作的证据。要防止接收者抵赖,可以在数字签名系统中要求接收者返回一个自己签名的表示收到的报文,给发送者或受信任第三方。如果接收者不返回任何消息,此次通信可终止或重新开始,签名方也没有任何损失,由此双方均不可抵赖。
4.数字签名可以对数据进行多重加密。手写签字的文件一旦丢失,文件信息就极可能泄露,但数字签名可以加密要签名的消息,在网络传输中,可以将报文用接收方的公钥加密,以保证信息机密性。
5.数字签名可以实现客户的身份认证。在数字签名中,客户的公钥是其身份的标志,当使用私钥签名时,如果接收方或验证方用其公钥进行验证并获通过,那么可以肯定,签名人就是拥有私钥的那个人,因为私钥只有签名人知道。
综上所述,数字签名的作用是接收方能够向第三方证明接收到的消息及发送源的真实性而采取的一种安全措施,其使用可以保证发送方不能否认和伪造信息。“数字签名”也是目前电子商务、电子政务中应用最普遍、技术最成熟的、可操作性最强的一种电子签名方法。
参考:
https://www.cnblogs.com/block2016/p/5623902.html
https://zhuanlan.zhihu.com/p/31477508
https://www.sohu.com/a/215306405_100027537