通俗理解数字签名,数字证书和https

简介:

前言

最近在开发关于PDF合同文档电子签章的功能,大概意思就是在一份PDF合同上签名,盖章,使其具有法律效应。签章有法律效应必须满足两个条件:

 ●   能够证明签名,盖章者是谁,无法抵赖
 ●   PDF合同在签章后不能被更改

在纸质合同中,由于签名字迹的不可复制性,盖章的唯一性以及纸质合同对涂改的防范措施(比如金额用大写)可以保证上述两点,从而具备法律效应,那么PDF合同如何保障呢?两个重要的概念就是数字签名和数字证书。这项技术广泛运用于文件认证,数据传输等。
为了弄懂这些,我花了2天时间从加密算法开始,到数字签名和CA证书,最后再重新认识下https的原理。

非对称加密

加密我了解的不多,只知道有这么两种算法:对称加密和非对称加密。

 ●  对称加密:加密和解密的密钥一样,比如用123加密就是用123解密,但是实际中密码都是普通数据在互联网传输的,这样一点密码被中间人截取并破解,加密直接被攻破。

 ●  非对称加密:把密钥分为公钥和私钥,公钥是公开的所有人都可以认领,私钥是保密的只有一个人知道。假设A要发送一封Email给B,他不想让任何其他人在传输中看到Email的内容,做法就是使用B的公钥对Email加密,只有B的私钥能够解密(B的私钥唯一性保证信件不会泄露)。

某天出意外了,有黑客冒充A给B发送Email,并且也用B的公钥加密,导致B无法区分这封邮件是否来自A。怎么办?此时A可以用自己的私钥加密,那么B收到邮件后如果用A的公钥可以解密邮件,那么证明这封信肯定来自于A。

OK,通过这个例子我想你们基本明白非对称加密了!我总结了下面几点:

公钥的作用:对内容本身加密,保证不被其他人看到。

私钥的作用:证明内容的来源

公钥和私钥是配对关系,公钥加密就用私钥解密,反之亦然,用错的密钥来尝试解密会报错。

数字签名

接着聊上面发邮件的例子,假设A用自己的私钥对Email加密发送,这样还存在啥问题吗?当然,它至少存在下面2个问题:

 ●   无法验证邮件在传输中是否被篡改。是的,任何人都可以用A的公钥解密邮件并篡改数据,更要命的是B收到邮件无法验证是否被篡改!
 ●  对文件本身加密可能是个耗时过程,比如这封Email足够大,那么私钥加密整个文件以及拿到文件后的解密无疑是巨大的开销。
数字签名可以解决这两个问题,下面看看A如何利用数字签名对邮件加密:
1.A先对这封Email执行哈希运算得到hash值简称“摘要”,取名h1
2.然后用自己私钥对摘要加密,生成的东西叫“数字签名”
3.把数字签名加在Email正文后面,一起发送给B
(当然,为了防止邮件被窃听你可以用继续公钥加密,这个不属于数字签名范畴)
4.B收到邮件后用A的公钥对数字签名解密,成功则代表Email确实来自A,失败说明有人冒充
5.B对邮件正文执行哈希运算得到hash值,取名h2
6.B 会对比第4步数字签名的hash值h1和自己运算得到的h2,一致则说明邮件未被篡改。

e403637a9406d55870a408abbde5a03be6710452
看完这个过程,是不是觉得数字签名不过如此。其实就是利用算法(不一定是非对称算法)对原文hash值加密,然后附着到原文的一段数据。数字签名的作用就是验证数据来源以及数据完整性!解密过程则称为数字签名验证。
不过先别着急,我在梳理数字签名流程时候有下面几点疑惑,不知你也是否一样?

1.如果中间人同时篡改了Email正文和数字签名,那B收到邮件无法察觉啊。
答案:数字签名的生成需要对方私钥,所以数字签名很难被伪造。万一私钥泄漏了呢,不好意思,你私钥都能弄丢了那这篇文章当我白写。(私钥绝对保密不参与传输)
2.公钥是公开的并且可以自行导入到电脑,如果有人比如C偷偷在B的电脑用自己公钥替换了A的公钥,然后用自己的私钥给B发送Email,这时B收到邮件其实是被C冒充的但是他无法察觉。
答案:确实存在这种情况!解决办法就是数字证书,一环套一环请接着看。

数字证书

上面第2点描述的安全漏洞根源在哪?就是A的公钥很容易被替换!我举个更生动的例子引出“数字证书”:

 ●  你是一名基层人员经常向村委会邮寄机密材料,并盖章签名,你提前给村委会一台“盖章校验器”,告诉他们用这玩意扫一下如果校验通过就证明材料来自我。某天C偷偷潜入村委会替换了你的“盖章校验器”,那么他可以光明正大地冒充你了。为了防止这种情况,村委会建议你把“盖章校验器”交给派出所保管,但是你得去派出所登记一下并领取身份证书,这样一来你每次邮寄材料除了盖章签名还需要附上派出所给的证书,村委会收到后先用证书去派出所取出你的“盖章校验器”,再像往常一样来校验你的签名盖章。

OK,“盖章校验器”就相当于你的公钥,派出所其实就是CA认证中心,这里的身份证书就是数字证书。那么数字证书是怎么生成的呢?以及如何配合数字签名工作呢?

1.首先A去找"证书中心"(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对A的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate):

470720f392471a3298e444e61b87451f9c716bf9

2.A在邮件正文下方除了数字签名,另外加上这张数字证书2379250b88142cdf813af607779e08557b50b617

3.B收到Email后用CA的公钥解密这份数字证书,拿到A的公钥,然后验证数字签名,后面流程就和图1的流程一样了,不再赘述。
和数字签名一样我在梳理这个流程时有下面几点疑惑:

 ●  假设数字证书被伪造了呢?
答案:是的,传输中数字证书有可能被篡改。因此数字证书也是经过数字签名的,是不是感觉很绕貌似陷入了“鸡生蛋蛋生鸡”,我保证这是最后一个蛋- - !上文说道数字签名的作用就是验证数据来源以及数据完整性!B收到邮件后可以先验证这份数字证书的可靠性,通过后再验证数字签名。
 ●  要是有1万个人要给B发邮件,难道B要保存1万份不同的CA公钥吗?
答案:不需要,CA认证中心给可以给B一份“根证书”,里面存储CA公钥来验证所有CA分中心颁发的数字证书。CA中心是分叉树结构,类似于公安部->省公安厅->市级派出所,不管A从哪个CA分支机构申请的证书,B只要预存根证书就可以验证下级证书可靠性。
 ●  如何验证根证书可靠性?

答案:无法验证。根证书是自验证证书,CA机构是获得社会绝对认可和有绝对权威的第三方机构,这一点保证了根证书的绝对可靠。如果根证书都有问题那么整个加密体系毫无意义。

举个栗子

上面一直在说虚拟场景,下文举个实际例子看看数字签名+数字证书如何验证文件的来源,以及文件的完整性。比如下载文件:我们开发中一般是服务端给文件信息加上md5,客户端下载完成后校验md5来判断文件是否损坏,这个其实就是简单的校验机制,而很多正规企业比如google都会给官方软件签署数字签名和证书,而windows已经预置了很多CA根证书:

b3e001c8f175d5eb1f3b9805e5ba004b9dfefe21

然后看下我之前从网上下载的Chrome.exe,右键属性,通过鼠标点击一步验证:d6f5b30a0c7a5232cac1e7d3d0f45c3488dec0f0

Google Inc就是google从CA中心申请的数字证书。这样看来,这个软件确实来源于google官方,并且文件完整。接下来我干点坏事,用notepad打开这个exe文件并且篡改里面的内容(修改二进制数据,09 改为33),保存:

2221a5671f3b949410c059185e8e2e01a9046c0c

再看下数字签名还正常吗?

e12208d906daad95db295196d008467085304480

文件被篡改导致数字签名无效,数字证书没有问题。

https简单介绍

数字签名和数字证书可以用于文件,当然也能用于html网页数据。本人没有https相关开发经验,故不做深入探讨只是简单介绍下。

http的安全缺陷

1.无法验证服务端的身份
2.无法保证数据完整性
3.无法保证数据传输不被窃听

而https就是专门解决这三个问题,https使用数字签名+数字证书解决了前2个问题,很多大型网站比如baidu.com都会采用https协议,网址左侧会出现绿色加锁标识:

f6708328f0932a5365a346e098780f980dacf60d

点击可以查看证书,另外浏览器都会内置CA根证书,来对这些网站的服务器证书进行校验。
然后,再用SSL协议对传输通道加密,保证数据传输不被窃听,这个SSL加密原理分为很多步骤不在本文讨论范围。
总结

全文比较深入地探讨了非对称加密,数字签名和数字证书的原理,最后引出https的简单介绍,如有差错尽请指正。


原文发布时间为:2018-09-14

本文作者:08_carmelo

本文来自云栖社区合作伙伴“安卓巴士Android开发者门户”,了解相关信息可以关注“安卓巴士Android开发者门户”。

相关文章
|
3月前
|
安全 数据安全/隐私保护
|
4月前
|
应用服务中间件 Linux 网络安全
Linux【脚本 06】HTTPS转发HTTP安装OpenSSL、Nginx(with-http_ssl_module)及自签名的X.509数字证书生成(一键部署生成脚本分享)
Linux【脚本 06】HTTPS转发HTTP安装OpenSSL、Nginx(with-http_ssl_module)及自签名的X.509数字证书生成(一键部署生成脚本分享)
62 1
|
11月前
|
安全 搜索推荐 网络安全
网站为什么要装https数字证书
互联网是个大染缸,汇聚融合了各种数据信息,而近年来发生的多起数据泄露事件,让网络安全和隐私问题成为了信息安全的雷区。这直接导致越来越多的企业及个人选择申请SSL证书,让网站使用HTTPS安全加密协议,放弃标准的HTTP协议。
|
11月前
|
Web App开发 安全 数据建模
网站为什么要装https数字证书
在 HTTP 的请求过程中,客户端与服务器之间没有任何身份确认的过程,数据全部明文传输,“裸奔”在互联网上,很容易导遭到黑客的攻击,无法保证数据安全。也是为了解决这一问题,才有了 SSL 证书的问世。
|
安全 算法 数据安全/隐私保护
HTTPS加密原理,搞懂什么是对称加密、非对称加密、证书、数字签名
众所周知,http协议是一种未加密的协议,我们未加密的数据,在传输的过程中会经过一个又一个的物理节点,如果被人通过抓包的方式拿到了我们的数据,将会给我们造成无法估量的损失。 为了解决解决这个问题,https应运而生。https通过加密的手段,保障的数据的安全性。那https的怎么加密的呢?这就是我们接下来需要讨论的内容。
HTTPS加密原理,搞懂什么是对称加密、非对称加密、证书、数字签名
|
安全 算法 网络安全
一文读懂Https的安全性原理、数字证书、单项认证、双项认证等
本文引用了作者Smily(博客:blog.csdn.net/qq_20521573)的文章内容,感谢无私分享。 1、前言 目前苹果公司已经强制iOS应用必须使用HTTPS协议开发(详见《苹果即将强制实施 ATS,你的APP准备好切换到HTTPS了吗?》),虽然Google没有强制开发者使用HTTPS,但相信不久的将来Android也会跟随iOS全面转向HTTPS。
2509 0
|
算法 安全 网络协议
透视HTTP协议-HTTPS、对称加密与非对称加密&数字签名与证书
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! HTTPS为什么要有HTTPS,简单的回答是“因为HTTP不安全”。什么是安全?通常认为,如果通信过程中具备了四个特性,就可以认为是“安全”的,这四个特性是:机密性、完整性、身份认证和不可否认。
透视HTTP协议-HTTPS、对称加密与非对称加密&数字签名与证书
|
存储 Web App开发
[解决办法]已经安装了数字证书,但是谷歌浏览器登录https协议的web系统时仍然提示证书不受信任
已经安装了数字证书,但是谷歌浏览器登录https协议的web系统时仍然提示证书不受信任。如下图: 解决办法: 1.单击Chrome浏览器右侧设置菜单,选择“设置”。 2.拖至页面下方,单击“显示高级设置”。
7338 0
|
算法 安全 网络安全
浅谈https\ssl\数字证书,互联网营销
  在互联网安全通信方式上,目前用的最多的就是https配合ssl和数字证书来保证传输和认证安全了。本文追本溯源围绕这个模式谈一谈。 名词解释   首先解释一下上面的几个名词: https:在http(超文本传输协议)基础上提出的一种安全的http协议,因此可以称为安全的超文本传输协议。
1353 0
|
安全 算法 网络安全
https原理及其中所包含的对称加密、非对称加密、数字证书、数字签名
https原理及其中所包含的对称加密、非对称加密、数字证书、数字签名一、为什么要使用https使用https的原因其实很简单,就是因为http的不安全。 当我们往服务器发送比较隐私的数据(比如说你的银行卡,身份证)时,如果使用http进行通信。
2109 0