通俗理解数字签名,ssl数字证书和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加密发送,这存在下面问题:

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


    图1.png

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

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

数字证书

上面第2点描述的安全漏洞根源在哪?就是A的公钥很容易被替换!那么数字证书是怎么生成的呢?以及如何配合数字签名工作呢?

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


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


    image.png
  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根证书:


image.png

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


image.png

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


image.png

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


image.png

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

https简单介绍

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

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

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


image.png

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

总结

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



作者:08_carmelo
链接:https://www.jianshu.com/p/4932cb1499bf
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

转载于:https://www.cnblogs.com/renjiaqi/p/10344488.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 性能分析工具——perf

最近需要对linux下的开发的数据库应用程序进行性能调试,找到了该篇文章,保存下来为了以后便于查找,这篇是转载的perf文章,后续还有vtune相关的文章。 转载:https://blog.csdn.net/u014608280/article/details/8026571…

红外遥控

红外遥控简介红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所…

使用jQuery Mobile移动开发框架将博客网站快速转化为Mobile网站

日期:2012-7-12 来源:GBin1.com 在线演示 jQuery Mobile是一个非常不错的移动端网站应用的解决方案,很多网站都使用jQuery Mobile来生成Mobile手机端的移动网站应用,在过去的GBin1博客文章中,我们曾经使用jQuery Mob…

CISSP的成长之路(十六):复习访问控制(1)

访问控制(Access Control)是CISSP知识体系中的第三个CBK,它的内容包括如何使用多种系统提供的安全功能来控制对组织的信息和数据处理资源的访问,这些访问控制措施通过管理、物理和逻辑控制的手段 在51CTO安全频道特别策划的CISSP…

NVLink技术及影响解析

1繁华的背面 最新GPU架构Pascal,能自己开上舞台的Audi A7,超过700名与会专家学者及技术人员,近百场学术会议和科研分享,连续两晚的happy hour、酒会和GTC Party……在一片喧嚣和欢乐当中,2014年度的GTC大会降下了帷幕。…

2022年结束了

在去年这个时候,我刚好也写了一篇这样的文章。再往前是2020年的总结年终了,肿一下斗转星移,我的这个公众号也陪伴着我经过了4年的时间,明年后,我也正式进入35岁程序员的行列,随时会受到命运对我的锤炼。庆幸…

STL容器之deque

双端队列&#xff1b;序列式容器(deque/vector)&#xff1b;底层分段连续 支持从双端进行插入和删除&#xff1b; 综合了vector和list的优点&#xff1b; 插入、删除、查找的平均时间复杂度都是O(1) 部分deque的操作如下&#xff1a; #include <stdlib.h> #include …

SQL游标原理和使用方法

数据库开发过程中&#xff0c;当你检索的数据只是一条记录时&#xff0c;你所编写的事务语句代码往往使用SELECT INSERT 语句。但是我们常常会遇到这样情况&#xff0c;即从某一结果集中逐一地读取一条记录。那么如何解决这种问题呢&#xff1f;游标为我们提供了一种极为优秀的…

varnish-cache使用

Varnish Cache是一个web加速软件&#xff0c;用作web服务加速的反向代理&#xff0c;与Squid不同的是它建立在较新的系统内核调用上&#xff0c;并且主要是使用内存作为缓存&#xff0c;它现有的使用者有facebook等&#xff0c;据使用者反馈&#xff0c;其与Squid相比&#xff…

CF617E XOR and Favorite Number

CF617E XOR and Favorite Number 已知一个序列 \(a_1,\ a_2,\ \cdots,\ a_n\) 和 \(k\) &#xff0c;\(m\) 次询问给出 \(l,\ r\) &#xff0c;求 \(\displaystyle\sum_{il}^r\sum_{ji}^r[a_x\oplus a_{x1}\oplus \cdots \oplus a_yk]\) \(n,\ m\leq10^5,\ 0\leq a_i,\ k\leq10…

2020年文章汇总

据悉&#xff0c;深圳某工程师沦为C语言笔试枪手修改cmdline 把内存改成512MB上拉电阻的作用剖析C语言是如何画出这样的三角形的c语言画谢宾斯基三角形Linux字符设备驱动实例哦&#xff0c;这是桶排序回答一个微信好友的创业问题Linux-C编程 / 多线程 / 如何终止某个线程&#…

不理解Zookeeper一致性原理,谈何异地多活改造

转载&#xff1a;http://developer.51cto.com/art/201805/574334.htm Zookeeper 是最终一致性的&#xff0c;由于多副本&#xff0c;以及保证大多数成功的 Zab 协议&#xff0c;当一个客户端进程写入一个新值&#xff0c;另一个客户端进程不能保证马上就会读到&#xff0c;但能…

作诗一首

只恐花尽老相催&#xff0c;为爱鸬鹚雨里飞。 大珠小珠落玉盘&#xff0c;今日征行何岁归。 今日&#xff0c;在此作诗一首&#xff0c;来抒发一下老周我对心爱的小邢的思念。虽内心迷茫&#xff0c;却仍然坚守&#xff1b;虽征邢之难&#xff0c;偏向邢征行。只为相信曾经——…

一道C#类型转换的思考题

c#中&#xff0c;short s1 1; s1 s1 1;有什么错? &#xff08;真有问题&#xff09;short s1 1; s1 1;有什么错?&#xff08;没问题&#xff09;分析&#xff1a;留给你们。转载于:https://www.cnblogs.com/legecoding/archive/2012/07/23/2604991.html

程序员修炼之道--从小工到专家(一)

这个假期里看了一下这本书&#xff0c;乍一看名字&#xff0c;觉得这就是比较鸡汤类的书吧&#xff0c;但是在看了一部分之后&#xff0c;忽然感觉到&#xff0c;以前的自己真的是很无知&#xff0c;一直就没有认识到做一个真实的项目的困难性&#xff0c;也根本就没有真正的认…

2018年文章汇总

Android ANR 实例分析Linux kernel计算某段代码运行时间Linux Kernel 发展和内核特点C/C函数指针与指针函数(二)老王带你理解算法复杂度O(1),O(N),O(N^2)Android NDK Tombstone/Crash 分析堆和栈的区别&#xff08;转过无数次的文章&#xff09;C语言scanf-周末杂想C语言-scanf…

C++11:右值引用和转移赋值

1、左值与右值的区别&#xff1a; 左值&#xff1a;能别赋值的值&#xff1b;能取到地址的值&#xff0c;用&能取到地址&#xff0c;具有持久性&#xff1b; 右值&#xff1a;临时变量&#xff1b;不能用&取到地址&#xff1b;只是字面常量值 2、右值引用 一般用的…

[备忘]Visual Studio常用小技巧

1. 怎样调整代码排版的格式&#xff1f; 选择&#xff1a;编辑—>高级—>设置文档的格式 或 编辑—>高级—>设置选中代码的格式。 格式化cs代码&#xff1a;Ctrlkf 格式化aspx代码&#xff1a;Ctrlkd 2. 怎样跳转到指定的某一行&#xff1f; 两种方法&#…

Angular CLI的简单使用(1)

参考地址: https://v2.angular.cn/docs/ts/latest/cli-quickstart.html Angular CLI是一个命令行界面工具&#xff0c;它可以创建项目、添加文件以及执行一大堆开发任务&#xff0c;比如测试、打包和发布。 1. 请先在终端/控制台窗口中运行命令 node -v 和 npm -v, 如下图,没有…

在没有数据集的情况下使用数据表

使用数据适配器填充数据表 View Code using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient;namespace PopDataTable {class Program{static void Main(string[] args){string connString…