文章目录
- 数字签名
- 工作原理
- 关键特点
- 应用实例
- 数字证书
- 数字证书和数字签名趣味实例
数字签名
数字签名是一种通过密码运算生成的数据,用于验证信息的完整性和来源,确保数据在传输过程中未被篡改,同时提供发送者的身份认证和防止抵赖的功能。它基于非对称密码加密系统,使用发送者的私钥对数据进行加密,接收方使用发送者的公钥进行解密和验证,以此来确认信息的完整性和来源。
数字签名的基本原理包括使用哈希函数将原始数据转换成报文摘要,然后用发送者的私钥对摘要进行加密,形成数字签名。接收方收到签名和原始数据后,使用发送者的公钥对签名进行解密,得到哈希摘要。通过比较这个摘要和用相同哈希函数对原始数据重新计算的摘要,可以验证数据的完整性和来源。
数字签名常用的算法包括RSA和ECC(椭圆曲线密码学),这些算法提供了足够的安全性,使得第三方难以伪造签名或篡改数据。数字签名与数据加密在原理与应用上的不同之处在于,加密主要关注数据的保密性,防止信息被未经授权的第三方获取,而数字签名则侧重于数据的完整性和发送者身份的验证。
工作原理
数字签名通常利用公钥加密技术,包括以下步骤:
- 创建签名:
- 发送方使用自己的私钥对消息或文件的散列(哈希)值进行加密。这个加密后的散列值即为数字签名。
- 附加签名:
- 签名通常会附加在消息或文件本身,或以某种形式发送给接收方。
- 验证签名:
- 接收方收到消息后,会使用相同的散列算法对消息生成散列值,并用发送方的公钥对数字签名进行解密。
- 如果解密后的散列值与接收方自行计算的散列值匹配,说明消息未被篡改且签名有效。
这里的核心关键点在于验证方持有的公钥是签名方给的,签名方的私钥不能泄露。保证以上两点,数字签名才能发挥作用。
假设第三方用自己的私钥给验证方发送伪造消息,验证方使用签名方的公钥肯定是无法解密的。
关键特点
- 身份验证:
- 数字签名帮助接收方确认消息或文件确实来自声称的发送方。
- 数据完整性:
- 确保数据在传输或存储过程中未被更改。任何对数据的微小更改都会在验证签名时被检测到。
- 不可否认性:
- 发送方在对信息进行数字签名后,不能否认之前进行过的通信或交易,这对法律和商业交易尤为重要。
应用实例
- 电子邮件安全:通过数字签名,电子邮件的接收者可以验证发件人的身份和邮件内容的完整性。
- 软件分发:开发者对软件包进行签名,用户可以验证软件包是否未被篡改且确实来自于可信的源。
- 文件和文档签名:数字签名被广泛用于法律文件和其他重要文件,确保文件的内容和签名者的身份得到认证。
数字签名是加密的反向应用,加密是利用私钥来解密数据,而签名是利用公钥来解密数据验证签名。
数字证书
上面在介绍数字签名时提到,接收方需要保证拿到的公钥是发送方的。接收方如何安全的拿到公钥而不被第三方篡改?自然的联想到对公钥进行签名,而签名又需要一对新的公私钥,陷入了无限套娃。套娃自然就交给权威机构(CA)来终止,由它们使用私钥来对申请者提交的公钥和身份信息进行签名,签名生成的东西美其名曰数字证书,颁发给发送方。发送方以后在发送数据时,顺带亮出自己的数字证书(就是公钥),接收方用权威机构的公钥验证下,能解,证明这个就是发送方的公钥。
权威机构也分一级二级三级等套娃,顶级机构颁发的证书叫根证书,不再需要别人证明自己。
数字证书是一种用于确认数字实体身份的电子文件。它通常包含公钥和证书持有者的身份信息(如姓名和电子邮件地址),以及签发机构(CA)的签名,该签名用于验证证书的真实性。
数字证书的格式普遍采用的是X.509V3国际标准,一个标准的X.509数字证书包含以下一些内容:
-
证书的版本信息;
-
证书的序列号,每个证书都有一个唯一的证书序列号;
-
证书所使用的签名算法;
-
证书的发行机构名称,命名规则一般采用X.500格式;
-
证书的有效期,通用的证书一般采用UTC时间格式;
-
证书所有人的名称,命名规则一般采用X.500格式;
-
证书所有人的公开密钥;
-
证书发行者对证书的签名。
数字证书和数字签名趣味实例
鲍勃有两把钥匙,一把是公钥,另一把是私钥。鲍勃的公钥可以给任何人,但是私钥只能自己保存。鲍勃的两个密钥中的任何一个都可以加密数据,另一个密钥可以解密该数据。
鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。
苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。尽管帕蒂和道格可能可以拿到苏珊加密后的信且拥有鲍勃的公钥,但是由于他们没有鲍勃的私钥,因此无法解密。
鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。
鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用Hash函数,生成信件的摘要(digest)。
然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature)。
鲍勃将这个签名,附在信件下面,一起发给苏珊。
苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。
苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。
复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成"数字签名",写信给苏珊,让苏珊用假的鲍勃公钥进行解密。
后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找"证书中心"(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。
鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。
苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的。
下面,我们看一个应用"数字证书"的实例:https协议。这个协议主要用于网页加密。
首先,客户端向服务器发出加密请求。
服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。
客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。
如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。
如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。
如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。