精华内容
下载资源
问答
  • Android安全加密:数字签名和数字证书 Android安全加密:Https编程 以上学习所有内容,对称加密、非对称加密、消息摘要、数字签名等知识都是为了理解数字证书工作原理而作为一个预备知识。数字证书是密码学里的...
  • 数字签名和数字证书

    2013-05-11 19:21:20
    用图文的方式对数字签名数字证书之间的关系进行一个详细说明、希望大家看后恍然大悟。我目前正在用C#做证书和签名这块,但进展十分不畅,如果哪位朋友有好的方法或者示例,请私信联系
  • 签名 当你在一个纸质文件上写上你的名字,按上你的指纹,就意味着这张纸上的内容经过了你的认可,你的笔迹指纹就是你身份的证明。...数字签名 在互联网时代,文件以电子形式存在电脑里,我们从网上下载的文件、程

    签名

    当你在一个纸质文件上写上你的名字,按上你的指纹,就意味着这张纸上的内容经过了你的认可,你的笔迹和指纹就是你身份的证明。这是因为,笔迹很难伪造,而每个人的指纹更是独一无二的。在签名前,我们会检查文件内容有没有歧义、有没有涂改、有没有多余不必要的空白等,确认无误后再写下我们的名字,而收到签名后文件的人,再次对文件内容及签名进行检查,以确保文件内容的有效性和完整性。

    因此,签名可以用来认证签名者的身份及确保被签名文件内容的真实性。

    数字签名

    在互联网时代,文件以电子形式存在电脑里,我们从网上下载的文件、程序等也很有可能被人植入木马病毒,这些电子文件不能像纸质文件一样,通过物理手段(笔迹和指纹)来签名,因此需要一种手段来对电子文件进行签名,即数字签名,来确保文件的真实性、有效性。

    在学习数字签名之前,需要先了解以下几个概念:

    1、HASH算法

    Hash,一般翻译做散列或音译为哈希,简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。常用的HASH算法有:MD5,SHA1,SHA256等。

    比如,“我是小新,我喜欢吃青椒,大姐姐你呢?”这句话的MD5值为:

    F282C0E90871AC370C57C1539D3CFDB6

    如果把这句话最后一个问号改为句号,则MD5值为:

    1515C89B2F8734049846E542B2CFAAB8

    哪怕只修改一个字符,哈希值也会不一样,因此,MD5这类哈希算法通常用来验证内容有没有被篡改。

    另外,总有人认为MD5是用来加密的,这是不对的,有加密就有解密,而MD5是不可逆向的,我们通常把用户输入的密码用MD5计算后保存到数据库,这确实起到了一定的“加密”的作用,因为数据库里保存的确实不是用户明文密码了,但是,没有人可以通过这个密文反推用户真实的密码,也就是说,不存在所谓的MD5“解密”。网上所谓的一些MD5破解,不过是用字典来匹配罢了,同一个字符串的MD5值是不会变的,因此只要有一个明文密码和其MD5值的字典,就可以用MD5值找其对应的明文密码,不过也不用担心,在保存用户名密码的时候加随机盐就能解决这个匹配的问题。2004年王小云教授证明了MD5可以碰撞,即两个完全不同的字符串可能计算出完全一样的HASH值,但跟破解没半毛钱关系。

    2、对称加密

    对称的意思是,加密和解密使用同一个密钥,常用算法有AES、RC4、3DES等。

    在谍战剧里,通常会有一个密码本(明文和密文对应关系列出来),在前些年很火的电视剧《潜伏》里,余则成就有一个密码本,每次收到密码后在纸上写下来,然后翻开密码本找对应的明文,只要这个密码本不泄露,军统的那些人就破解不了他的密码。当然,在现实里,即使密码本没有泄露,为了保证安全,地下工作者也可能会不定期更换密码本。

    还有一个真实的事件:在抗日战争时期,有一段时间,重庆每天遭受日机多架次的狂轰滥炸,高射炮每次都打不下来,日军的飞机总在高射炮的射程之外,后来密码学专家破译了一个叫独臂大盗的间谍发送给日军的电报,他是一名高射炮团的营长,他用电报机发送密文将高射炮的射程告诉了日军,他的密码本是诺贝尔文学奖获得者赛珍珠的长篇小说《大地》,书的页码是密文,每一页的第一个单词是明文,他用电报机传送页码给日军,日军情报部门用页码找对应的英文单词,这样,就完成了情报的加密和解密。

    3、非对称加密

    非对称加密即加密和解密使用的不是同一个密钥,而是一个密钥对,密钥对包含一个公钥和一个私钥,它的原理是找几个很大的质数进行一些数学运算,这些质数满足一定的数学关系。常用非对称加密算法有RSA,DSA/DSS等。

    • 公钥加密的数据只有其对应的私钥才可以解密,私钥加密的数据只有其对应的公钥才可以解密。公钥可以告诉任何人,但是私钥绝对不能泄露。
    • 私钥加密的信息,拥有公钥的人都可以解密,而公钥加密的信息,只有有私钥的人才可以解密。
    • 非对称加密要比对称加密更安全,计算也更复杂,但是要知道,世界上没有什么密码是破解不了的,只是时间问题
    • 私钥还可以用于签名,验证对方是否为私钥拥有者,公钥不能用于签名,因为公钥谁都可以有。

    下面举例说明什么是数字签名和数字证书:

    小张考上了北京大学,小李进了中等技术学校,小红在百货公司当售货员:他们都有光明的前途。这些都不重要,重要的是小张和小李都喜欢小红。

    1、小红有两把钥匙,一把是公钥,另一把是私钥。小红把公钥送给小张和小李各一把。

    2、小张给小红写信,然后用公钥加密,小红收到信以后用私钥解密,得到信的内容:“我们在一起吧!”。

    3、小红给小张回信,她决定进行数字签名,她先用HASH函数(如MD5)计算信的摘要,然后再用私钥把摘要也加密,生成一个数字签名,再把信也加密,最后把签名放到信的后面一起发给小张。

    4、小张收到信以后用公钥解密,得到信的内容:“好!”,然后用公钥解开信后面的数字签名,可以得到信息摘要,证明信确实是小红写的,然后自己再用MD5计算一下信的信息摘要,跟前面得到的摘要相等,证明信没有被修改过。

    5、这跟小李有什么关系呢?这就有了,小李自学黑客知识,黑进了小张电脑,由于小李也有一把公钥,所以他也可以解密,看到了回信内容。

    6、恼羞成怒的小李决定破坏他们的感情,于是小李自己生成了一对公钥和私钥,然后用自己的公钥替换了小张的公钥,然后冒充小红写信给小张,并用自己的私钥加密。

    7、小张收到信后,用公钥(已经被替换为小李的公钥)解密,得到信的内容:“我们分手吧!”。小张懵了,而小李一脸奸笑。

    8、小张坐火车去找小红,结果两人发现那封信是被人冒充了,小张的公钥被替换了,不是小红的,那怎么保证小张拥有的公钥确实是小红的呢?小红跑到证书机构(CA)给自己的公钥做认证,证书机构也有一对公钥和私钥,证书机构用自己的私钥对小红的公钥及小红的个人信息等进行加密,得到一个数字证书

    9、小红再次给小张写信,签名、加密,并把签名和数字证书一起发给小张。

    10、小张拿到数字证书,用CA的公钥解开证书,得到正确的小红的公钥,然后就可以解密信的内容和验证签名。

    再看一个HTTPS的例子,过程大致如下:

    1、客户端请求服务端,告诉服务端自己支持的加密方法

    2、服务端发送证书链给客户端

    3、客户端验证证书链的有效性,比如证书是否过期,证书的域名是否是当前请求的域名等

    4、证书验证有效后开始协商对称密钥,客户端用非对称加密方法如RSA加密协商好的对称密钥,然后发送给服务端

    5、之后开始用对称密钥通信

    注意,因为非对称算法相对复杂,计算耗时,所以非对称加密只用来加密协商好的对称密钥,保证这个对称密钥在传输过程中不被泄露。

    数字证书

    数字证书的作用,是保证你可以获取到正确的公钥。有了正确的公钥,才能保证信息的正确性、安全性、完整性。

    数字证书需要去证书机构(CA)申请,证书机构也有一对公钥和私钥,证书机构用自己的私钥对你的信息(比如SSL证书中包含了证书版本、序列号、使用的算法、颁发机构、域名、证书过期时间、域名所有者等等)加密,得到一个属于你的数字证书。

    CA下面还可以有二级甚至三级、四级等CA机构,每一级CA自己的证书从上一级申请,这样一级一级相互保证,形成一个证书链,最顶级的证书叫根证书,根证书由根证书颁发机构自己给自己颁发,叫自签证书。根CA有最高的权威性,这些CA的公钥可以在网上查到,因此无法伪造。操作系统以及一些浏览器通常内置了一些根证书颁发机构颁发的证书。

    SSL证书的验证

    浏览器在收到服务器发送过来的证书链后,调用证书验证函数去验证,只要根证书是有效的,则整个证书链都没有问题,否则浏览器会给出证书有问题之类的警告。

    这是谷歌浏览器的证书:

    点浏览器地址栏域名左边的锁图标,可以查看当前网站的证书,比如CSDN的证书:

    数字证书格式

    证书文件的结构也是有标准的,比如文件里包含什么信息,用什么编码,第一行记录什么,第二行记录什么等等,详情看这里

    x.509

    基本的证书格式,只包含公钥。
    x509证书由用户公共密钥和用户标识符组成。此外还包括版本号、证书序列号、CA标识符、签名算法标识、签发者名称、证书有效期等信息。

    PKCS#7

    Public Key Cryptography Standards #7。
    PKCS#7一般把证书分成两个文件,一个公钥、一个私钥,有PEM和DER两种编码方式。PEM比较多见,是纯文本的,一般用于分发公钥,看到的是一串可见的字符串,通常以.crt,.cer,.key为文件后缀。DER是二进制编码。
    PKCS#7一般主要用来做数字信封。

     

    展开全文
  • 数字签名和数字证书的区别与联系

    千次阅读 多人点赞 2019-04-30 11:57:42
    前言 最近在开发关于PDF合同文档电子签章的功能,大概意思就是在一份PDF合同上签名,盖章,使其具有法律效应。签章有法律效应必须满足两个条件: 能够证明签名,盖章者是谁,无法抵赖 ...两个重要的概念就是数字签...

    前言

    最近在开发关于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
    来源:简书

    展开全文
  • 你要说这个,那我可来劲了,于是乎从加密、数字签名一直讲到了数字证书。。。终于把女朋友讲睡着了,独自写下这篇文章。 正文 如果你能非常清晰的回答出以下问题,可以直接拉到最下面帮我点个赞~,把时间用去陪陪女...

    前言

    这本是 2020 年一个平平无奇的周末,小北在家里刷着 B 站,看着喜欢的 up 主视频。

    在一旁玩手机的女朋友突然问”你知道数字证书是来干啥的不,为啥浏览器提示证书不可信?”

    你要说这个,那我可来劲了,于是乎从加密、数字签名一直讲到了数字证书。。。终于把女朋友讲睡着了,独自写下这篇文章。

    正文

    如果你能非常清晰的回答出以下问题,可以直接拉到最下面帮我点个赞~,把时间用去陪陪女朋友:

    1. 非对称加密中公私钥都可以加密,那么什么时候用公钥加密,什么时候用私钥“加密” ?

    2. 什么是数字签名,数字签名的作用是什么?

    3. 为什么要对数据的摘要进行签名,而不是直接计算原始数据的数字签名?

    4. 什么是数字证书,数字证书解决了什么问题?

    这篇文章,主要围绕数字签名数字证书的原理以及它们的作用展开。

    争取做到让不具备任何密码学基础知识的同学都能听懂,所以在这里需要先对齐一些加密相关的概念 。

    1. 什么是加密

    加密就是对明文数据按某种特殊算法进行处理,使其成为不可读的一段代码,通常称为“密文“, 密文通过”密钥“解密后还原出原来的明文,通过这样的途径可以达到保护数据不被非法人窃取、阅读的目的。

    定义简单吧?那来看个题,考虑以下哪些属于加密方法:

    • AES
    • RSA
    • MD5
    • BASE64
    • SM4

    这几种都是日常开发中常用的数据编码技术,但是只有 AES、RSA、SM4 才能算是加密方法。

    为什么呢?一个区分的简单方法就是看编码后的数据是否还能还原,能还原的是加密。

    MD5 实际上是对数据进行有损压缩,无论数据有多长,1KB、1Mb 还是 1G,都会生成固定 128 位的散列值,并且 MD5 理论上是不可能对编码后的数据进行还原的,即不可逆。

    MD5 因为其具有不可逆性、单向恒定性(相同的数据多次计算值不变)被广泛应用于文件完整性验证、口令加密以及接下来会讲到的数字签名中。

    至于 BASE64 是否算做加密方法,仁者见仁。在这里不下结论,因为 BASE64 编码不需要密钥,且编码后的字符串任何人都可以解码出原串,所以一般不认为是加密方法。BASE64 常用来做转码,把二进制字节序列转化为 ASCII 字符序列。

    2. 加密算法的分类

    加密算法按照加解密使用的密钥是否相同,可分为:

    • 对称加密(Symmetric Cryptography)
    • 非对称加密(Asymmetric Cryptography)

    1. 对称加密

    对称加密是指加密和解密时使用同一个密钥。

    2. 非对称加密

    非对称加密是指加密和解密使用不同的密钥,这两个密钥分别叫做「公钥」、「私钥」。

    公钥是可以公开给所有人的,而私钥需要自己保密的。

    公钥加密的数据只能用私钥解密:

    同理,私钥“加密”的数据只能用公钥“解密”:

    大家注意到没,我对 私钥“加密” 这里打了引号,为什么呢?

    因为私钥不是用来加密的,准确的说法应该是 「私钥签名,公钥验签」

    这个问题很多同学都存在误解,认为公私钥都可以用于加密。

    实际上不是的,至于为什么,后面讲完签名我会解释的。

    3. 故事开始

    为了讲这个故事,小北请来了密码学中常用的学术情侣,Alice 和 Bob,以及窃听者代表 Eve。

    我们从 Alice、Bob 约会的故事展开,来讲讲其中暗藏着哪些危机,又是如何一步步化解的。

    3.1 第一回合

    九月,一个夜黑风高的晚上,Bob 想约 Alice 出来玩,于是给 Alice 发了一封邮件:
    明文通信

    但我们都知道网络是不可信的,并且由于消息在网络中是明文传输的,所以黑客可以轻易的截获、篡改甚至冒充 Bob。

    来,我们看看黑客 Eve 是怎么干的:

    黑客窃听伪造

    瞧,Eve 轻易的拿到了邮件内容 (窃听),并且修改了邮件内容 (篡改),甚至说他可以随时冒充 Bob 给 Alice 发送邮件 (伪装)

    如果上图中 Eve 伪造的内容被 Alice 接收到了,那么后果可想而知。

    现实世界中,我们每天都在通过网络进行聊天、转账、浏览不存在网站。

    如果都是这样明文传输数据,显然毫无安全感。

    3.2 第二回合

    既然我们不能明文传输,那么 Bob 和 Alice 提前商量好密钥,使用对称加密对邮件内容加密不就好了~

    对称加密

    现在 Bob 发送的邮件都使用和 Alice 提前商量好的密钥加密后再传输。

    由于没有密钥,Eve 就算截获到数据也无法获取邮件的内容,也没法篡改和冒充 Bob。

    因为篡改后的数据必须使用密钥再次加密 Alice 才能正确解密。

    那么只要 Bob 和 Alice 能够保证 密钥不泄露,整个通信就是安全的。

    如果密钥泄露,被中间人截获,那么就等同于明文通信。

    所以我们不能把安全性寄托在人上面。

    并且这里也存在一个问题,如果两个人不能线下见面, 如何在网上安全的交换密钥呢?

    这似乎是无解的,因为交换密钥的时候我们必须明文通信,不然对方根本看不懂。但是明文交换即意味着可能泄露。

    但是别忘了我们的密码学工具箱里还有一个好东西— 「非对称加密」

    Bob 和 Alice 各自生成一对公私钥,因为公钥本来就是公开的,即可以被任何人获取,所以可以通过网络明文交换公钥。

    然后使用公钥加密邮件内容后发送给对方,接收者使用自己的私钥即可解密。完美~

    3.3 第三回合

    来看看,在非对称加密体系下,Bob 如何给 Alice 发消息的。

    首先 Alice 需要先生成一对公私钥,私钥只能 Alice 自己知道,公钥是可以让任何人都知道的,因此可将公钥直接发送给 Bob,就算被截获也无所谓。

    非对称加密

    Bob 使用 Alice 的公钥加密邮件内容,加密后的内容只能由 Alice 的私钥解密,所以就算 Eve 截获也是徒劳。

    反之,如果 Alice 想给 Bob 回信,就需要用 Bob 的公钥加密后发送。

    这就解决了密钥交换问题,也保证了邮件内容不会泄露。也就是说现在可以防窃听

    3.4 如何证明 Bob 是 Bob

    不知道你注意到没有,这里也存在另外一个问题:

    Eve 也可以使用 Alice 的公钥冒充 Bob 给 Alice 发邮件啊,因为 Alice 的公钥本来就是公开的,任何人都可以获得。

    由于 Eve 也可以获得 Alice 公钥,所以没法防止 Eve 伪造篡改,并且对于 Alice 而言,她无法分辨出邮件到底是 Eve 发的还是 Bob。

    所以这个问题的本质就是 「Alice 如何确认邮件来自于 Bob」

    那么在生活中,我们如何做这件事呢?

    那就是让 Bob 在纸上签名并且按手印,因为指纹和字迹是 Bob 独有的,其它人很难伪造。

    所以我们需要在计算机中引入类似的机制:

    即只有 Bob 自己能够产生的独一无二的标志,并且其它人能够验证这个标志确实是属于 Bob的。

    这就是我们今天要讲的主题—「数字签名」。

    还记得什么是 Bob 独有的吗?

    对,就是 Bob 自己的私钥,Bob 用自己的私钥对邮件内容计算一个「签名」,将「签名」和邮件内容一起发送出去,接受者 Alice 可以使用 Bob 的公钥验证这个签名是否正确,这就叫「验签」。

    如果不是 Bob 的私钥计算的签名,那么 Alice 用 Bob 公钥验签将会出错。

    可以看到, Eve 试图使用自己的私钥计算签名然后发送给 Alice, 但是 Alice 使用 Bob的公钥进行验签时将会出错!

    那么 Eve 可能篡改内容并冒充 Bob 的签名吗?不可能!因为内容发生改变时,对应的签名也需要重新计算,而签名的生成依赖于私钥,只要 Bob 的私钥不泄露,签名就不会被冒充。

    啊啥?你说万一私钥泄露了怎么办?那就当我没说…

    所以使用数字签名,我们能够鉴别消息的发送者,也就是说黑客无法伪装发送者进行发送数据,也无法篡改。

    注意:

    可以看出我们这里数据是明文传输的,存在窃听风险。但是我们为了阐述数字签名机制是如何运转的,故意将保证信息机密性的机制省略了。

    如果想要保证数据的机密性,我们常见的做法是,通信双方通过非对称加密安全交换对称加密的密钥,后续通信过程的数据都使用对称加密保证数据机密性。

    并且「签名」的作用本身也不是用来保证数据的机密性,而是用于验证数据来源的防止数据被篡改的,也就是确认发送者的身份。

    一般而言,我们不会直接对数据本身直接计算数字签名,为什么呢?

    因为数字签名属于非对称加密,非对称加密依赖于复杂的数学运算,包括大数乘法、大数模等等,耗时比较久。

    如果数据量大的时候计算数字签名将会比较耗时,所以一般做法是先将原数据进行 Hash 运算,得到的 Hash 值就叫做「摘要」。

    「摘要」就像人的指纹一样,可以代表一个人,只要内容发生了改变,计算出来的摘要也应该变化。

    「摘要」最好是不可逆转的,一般使用开头提到的 MD5 作为 Hash 函数,MD5 输出的结果固定位 128 位。

    为什么「摘要」最好是不可逆转的?

    因为既然 Alice 可以用 Bob 公钥解开签名,那么理论上其它人,比如 Eve 也可以使用 Bob 公钥解开签名拿到数据。

    所以我们最好对数据的「摘要」进行签名,这样,Eve 就算解开签名,拿到的也是「摘要」,如果摘要是不可逆转的,也就是无法从摘要反推出原文,也就达到了保密的作用。

    发送者使用私钥对「摘要」计算数字签名。那么接收者如何验证呢?

    接受者 Alice 收到后,取下数字签名,同时用 Bob 的公钥解密,得到「摘要1」,证明确实是 Bob 发的

    ( 画外音:如果使用 Bob 的公钥验证签名出错,那么签名一定不是 Bob 的私钥生成的)

    再对邮件内容使用相同的散列函数计算「摘要2」,与上面得到的「摘要1」进行对比,两者一致就说明信息未被篡改。

    这样两步分证明发送者身份和保证数据未被篡改。

    3.5 这就够了吗?

    Bob 和 Alice 现在可以依赖于对称加密进行保密通信,也可以依赖于数字签名验证消息是否是对方发送的。

    但是这一切的根基是建立在 Alice 持有的公钥确实是 Bob的,反之亦然。

    什么意思呢?

    试想,Eve 如果将自己的公钥冒充 Bob 发送给 Alice,然后 Alice 保存了下来,那以后凡是 Bob 发送的消息,反而会验证签名失败,被当做冒充者。
    那你可能会问,为什么 Eve 可以将自己的公钥发送给 Alice,而 Alice 毫不知情呢?
    伪造公钥

    看!我们又回到了最初的起点,只不过这次被篡改的是公钥,之前是消息本身。

    因为 Bob 的公钥是直接通过网络发送给 Alice的,所以 Eve 才可以在这一步做手脚,进行篡改,将自己的公钥冒充 Bob 发送给 Alice,也就是发送公钥这一步没有做到:

    • 防篡改
    • 防冒充

    防篡改怎么和防冒充怎么实现的呢?

    我们前面讲了,就是靠数字签名! 但是数字签名需要接受者持有发送者公钥,才能进行验签。

    而我们现在处理的是分发公钥这一步,所以…死锁了。这像是先有鸡还是先有蛋的问题

    现在的问题就是「Bob 无法证明它自己是 Bob」。

    这个是不是似曾相识,以前去办事的时候经常被要求出具「我妈是我妈」这类证明。但是我们自己说“我妈就是我妈”,人家根本不会信呀,需要一个可信第三方出具证明,比如派出所。

    那么「Alice 如何才能确认 Bob 发送给自己的公钥确实是 Bob 的,而没有被篡改?」

    在只有 Alice 和 Bob 两人的情况下是没法验证的。

    所以,我们这里也需要一个第三方帮 Bob证明 「Bob 的公钥就是 Bob 的公钥」,有点绕口令那感觉了~

    3.6 数字证书

    为了解决这个问题,就引入了「数字证书」,什么叫数字证书呢?

    百度百科:

    数字证书是指在互联网通讯中标志通讯各方身份信息的一个数字认证,人们可以在网上用它来识别对方的身份。

    因此数字证书又称为数字标识。数字证书对网络用户在交流中的信息和数据等以加密或解密的形式保证了信息和数据的完整性和安全性。

    看了这个描述,是不是感觉还是云里雾里,还是我用大白话来说吧~

    只要你理解了前面的数字签名,就能理解这里的数字证书,因为我把数字证书叫做「公钥的数字签名」。

    为什么呢?我们引入数字证书的目的是为了保证公钥不被篡改,即使被篡改了也能识别出来。

    而防篡改的方法就是数字签名,但是这个签名不能我们自己做,原因说过了,因为我们的公钥还没分发出去,别人无法验证。

    所以只能找可信的第三方来帮我们签名,即证书颁布机构(CA),CA 会将:证书的颁布机构、有效期、公钥、持有者(subject)等信息用 CA 的私钥进行签名。

    并且将签名结果和这些信息放在一起,这就叫做「数字证书」。

    这样,Bob 就可以去 CA 申请一个证书,然后将自己的证书发给 Alice,那么 Alice 如何验证这个证书确实是 Bob的呢?

    当然是使用 CA 的公钥进行验签。

    注意:

    CA 的公钥也是需要使用证书来分发的,所以 Alice 的电脑必须安装 CA 的证书,证书里包含了 CA 的公钥。

    收到 Bob 发过来的数字证书后,Alice 使用 CA 的公钥进行验证,验证通过即证明这确实是 Bob 证书,也就可以使用证书中包含的 Bob 的公钥,按照之前讨论的流程进行通信。

    那么 Eve 是否可以在中途篡改 Bob 的证书呢?

    答案是不行,因为证书的信息使用 CA 的私钥进行签名,只要 Eve 修改了任何一个 Bit 都会导致最后签名验证不通过。

    那 Eve 可不可以修改证书信息后自己重新计算一次证书的数字签名呢?

    也不行,因为证书的数字签名计算依赖于 CA 的私钥,Eve 是拿不到 CA 的私钥的。

    如果拿到了,说明什么?整个世界都是不可信的。

    3.7 数字证书长啥样

    这是我电脑中的自带的证书:

    电脑自带证书

    可以看到,包含了证书持有人的公钥和证书的签名。

    另外,证书颁发机构是有层级关系的,下级 CA 的证书是需要由上级 CA 签名的。

    换句话说一定存在根证书颁发机构,那么他们的证书是由谁签名的呢?

    答案是自签,自己给自己认证。

    这是我电脑中的一个自签的根证书颁发机构:

    自签的根证书机构

    为什么根证书可以自签,谁来保证安全?

    你把钱存在银行,你会担心吗?我们基于对国家的信任,才信任银行,这就是信任链的基础!我们思考问题应该是分层的,如果不认可一个统一的基础,一直套娃下去,那么问题就无解。

    那还有个问题,如何保证根证书的可靠性?
    这是操作系统和浏览器预装的,由微软、苹果等操作系统厂商来选择根证书。

    3.8 证书不可信?

    那么什么情况下浏览器会提示 “证书不可信” 呢?

    根据我们上面的分析,下面是可能的原因:

    1. 证书不是权威 CA 颁发

    有些企业为了贪图便宜使用盗版的证书,没有经过 CA 认证。也就是无法使用浏览器内置 CA 公钥进行验证。

    1. 证书过期

    上面说了,证书里有一项就是有效期,一般就是一年或者两年的时间。如果证书过期,那么浏览器就会提示“证书不可信”

    1. 证书部署错误

    可能是服务器证书部署出错,比如证书与域名不匹配,因为证书里有一项是持有人信息的。

    好了,饶了一大圈,Bob 终于可以安全的向 Alice 发出前往红树林的邀请了~

    附录

    QA

    现在我们来回答文章开头提出的一些问题:

    1. 非对称加密中公私钥都可以加密,那么什么时候用公钥加密,什么时候用私钥“加密” ?

      • 加密场景,那么肯定希望只有我才能解密,别人只能加密。即公钥加密,私钥解密。

      • 签名场景,既然是签名,就希望只能我才能签名,别人只能验证。即私钥签名,公钥验签

    2. 什么是数字签名,数字签名的作用是什么?

      • 数字签名就是使用私钥对数据摘要进行签名,并附带和数据一起发送。

      • 可以起到防篡改、防伪装、防否认的作用。

    3. 为什么要对数据的摘要进行签名,而不是直接计算原始数据的数字签名?

      • 数据可能比较大,签名是使用非对称加密算法,比较耗时
      • 防止第三方使用公钥解开签名后,拿到原始数据
    4. 什么是数字证书,数字证书存在解决了什么问题?

      • 数字证书就是由 CA 机构使用自己私钥,对证书申请者的公钥进行签名认证。

      • 数字证书解决了如何安全分发公钥的问题,也奠定了信任链的基础。

    絮叨

    大家如果觉得写得不错,可以帮小北,点个「关注」,点个赞~

    你们的三连就是我创作的最大动力!

    我是小北,一个每天在电脑前敲键盘的硬核男人,我们下期见!

    欢迎大家关注我的公众号「编程指北」,每周最先更新原创好文。

    展开全文
  • 公钥、私钥、数字签名和数字证书简介

    千次阅读 多人点赞 2018-11-03 14:31:26
    简单来说分为两种,对称加密非对称加密。 对称加密: 加密解密用的是同一个秘钥,在对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA等。这类加密算法的优点就是计算量小、加密速度...

    加密方式

    简单来说分为两种,对称加密和非对称加密。

    对称加密:

    加密和解密用的是同一个秘钥,在对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA等。这类加密算法的优点就是计算量小、加密速度快、加密效率高;但是缺点也很明显,在传输数据前,双方必须商定并保存好秘钥,任何一方的秘钥被泄露,加密信息就不再安全了。另外,每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。

    非对称加密:

    非对称加密需要两个秘钥来进行加密和解密,这两个秘钥非别是公有秘钥(公钥)和私有秘钥(私钥),公钥与私钥是一对,如果用公钥对数据进行加密,那么就必须用对应的私钥才能解密;同理,如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。在非对称加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。

    工作流程(如下图):

    1、首先乙生成一对公钥和私钥,自己保存好私钥,并将公钥向其他所有人公开
    2、然后甲使用乙的公钥对原始数据进行加密,并将生成的密文发送给乙
    3、乙接收到消息后用自己的私钥对密文进行解密,得到原始数据
    即使密文在传输过程中被截获了也没关系,因为别人根本不知道乙的私钥,所以无法解密。同理,如果乙要给甲回信,首先乙要得到甲的公钥,然后用甲的公钥对消息进行加密,发送给甲,甲用私钥进行解密。
    百度图片
    上面的传输方式看似无懈可击,但是请设想这样的一个场景:由于公钥是公开的,所以除了甲以外其他人也知道乙的公钥,那么这时候我们就能用乙的公钥对消息进行加密,然后冒充甲给乙发消息,导致乙无法区分消息到底是不是甲发送的。
    为了解决这个问题可以这样做:首先甲用自己的私钥对消息进行加密,生成另一个密文,然后将密文发送给乙,乙收到消息后,如果能用甲的公钥对密文进行解密,就说明这个这个消息确实是甲发送的。

    数字签名

    虽然上面的方法解决了身份认证的问题,但是由于所有人都有甲的公钥,所以只要消息发送中途被截获就一定能被解密;而且对文件加密可能是个耗时过程,比如文件足够大,那么用私钥加密整个文件以及拿到文件后解密的开销无疑是巨大的。为了解决这两个问题数字签名就被提了出来,有了数字签名就可以用下面的方式发送消息了:

    1. 甲先用hash函数对消息进行运算,得到的hash值成为“摘要”,我们就叫它h1吧
    2. 然后甲用自己私钥对摘要进行加密,生成的密文就叫做“数字签名”,我们就叫它signature吧
    3. 之后用乙的公钥对消息进行加密,生成的密文就叫secret吧
    4. 最后把密文secret和signature一起发送给乙
    5. 乙收到后首先用甲的公钥对signature进行解密,如果能够解密说明消息确实是甲发送的,失败说明不是甲发的
    6. 然后乙用自己的私钥对密文secret进行解密,并使用相同的hash函数对解密后的结果进行运算,得到一个hash值,我们就叫它h2吧,如果h2=h1,说明消息内容没有被篡改,如果不等于说明消息内容中途被篡改了
      流程图如下:
      在这里插入图片描述

    有了数字签名,我们就可以验证消息来源和消息的完整性了,但是这个过程真的就完美了吗?让我们设想以下场景:如果第三者丙偷偷在乙的电脑用自己公钥替换了甲的公钥,然后用自己的私钥给乙发送消息,这时乙收到的消息其实是被丙冒充的,但是乙却无法察觉,仍认为是甲发送的消息。
    为了解决上面这个问题数字证书就出现了。

    数字证书

    在说数字证书之前,我们首先要搞明白导致发生上面那种情况的根源在哪里?本质上来说就是乙无法区分电脑中公钥到底是谁的,以至于乙会把丙错当成甲,所以我们就要想办法给公钥做身份认证(数字证书),以便能让别人搞清楚公钥到底是谁的。有了数字证书后就可以用以下方式发送消息了:

    1. 首先甲去找"证书中心"(certificate authority,简称CA),为自己公钥做认证(就好比去公安局办身份证一样)。CA用自己的私钥对甲的公钥和一些其他信息进行加密,生成的东西就叫"数字证书"(Digital Certificate)
      在这里插入图片描述

    2. 甲给乙发送的消息如下:
      在这里插入图片描述

    3. 乙收到消息后用CA的公钥解密甲的数字证书,拿到甲的公钥,然后验证甲的数字签名,后面流程和上面的一样。

    如此一来问题就解决了,但是新的问题又出现了:每个人都有一个CA给颁发的数字证书,如果有一百万个人给乙发消息,那么乙就要保存一百万份不同的CA公钥来验证这些人的身份。显然这是不可能接受的,所以就有了“根证书”,里面存储CA公钥来验证所有CA分部颁发的数字证书,乙直接保存一份“根证书”就可以验证所有人的身份了。最后一点就是“根证书”的可靠性有谁来保证呢?确切的来说无法保证,就好像你自己无法证明你是你一样,“根证书”也是如此,只不过CA机构是获得社会绝对认可和有绝对权威的第三方机构,就像政府法院一样,这一点保证了根证书的绝对可靠。如果根证书都有问题那么整个加密体系毫无意义。

    展开全文
  • Android--数字签名和数字证书

    千次阅读 2017-12-08 10:18:19
    一、数字签名 1. 概述 数字签名是非对称加密与数字摘要的组合应用 2. 应用场景 校验用户身份(使用私钥签名,公钥校验,只要用公钥能校验通过,则该信息一定是私钥持有者发布的)校验数据的完整性(用...
  • 数字签名和数字证书的原理解读(图文)

    万次阅读 多人点赞 2019-03-05 15:53:37
    数字签名和数字证书的原理解读(图文) 发布日期:2018-10-11 数字签名和数字证书的区别是什么?数字证书是由权威机构CA证书授权中心发行的,能提供在Internet上进行身份验证的一种权威性电子文档。而数字签名是一种...
  • 可强制签名已过期数字签名,这是成品exe,若容查杀没毒
  • 深入理解加密、解密、数字签名和数字证书!!!!!!!!
  • 看图片 读故事:轻松理解数字签名和数字证书。什么事数字签名?什么是数字证书?看完就明白了。
  • 本文转自 bilinyee博客,原文链接: http://blog.51cto.com/ericfu/1834797 如需转载请自行联系原作者
  • 可强制签名已过期数字签名,这是成品exe,若容查杀没毒
  • Android安全加密:数字签名和数字证书 Android安全加密:Https编程 一、数字签名1. 概述数字签名是非对称加密与数字摘要的组合应用2. 应用场景 校验用户身份(使用私钥签名,公钥校验,只要用公钥能校验通过,则该...
  • 加密解密采用不同的算法实现,这样的好处是不需要像传统对称加密算法一样将相同算法的密钥分发给对方,从而减少密钥被获取所带来的严重危害,目前基本上都是采用非对称算法,而RSA是最为广泛的。理论上1024位以上...
  • java 国密算法实现,包含SM2 SM3 SM4和数字签名数字证书的验证以及相应的说明文档
  • 2、数字证书是由权威公证的第三方认证机构(即CA,Certificate Authority)负责签发管理的、个人或企业的网络数字身份证明。 3、数字签名是电子签名的一种形式,是电子签名的子集。是用数字证书对电子文件签名后...
  • 消息摘要是指从作为数字签名对象的文件整体中计算出来的数值。对比由文件计算出的信息摘要,可以证明文件的内容有没有被篡改。通过摘要算法计算后的消息摘要其长度总是固定的,所以也叫数据指纹,它可以唯一地标识一...
  • 详细介绍了区块链使用的不对称加密在数字证书数字签名的应用
  • 它用图片通俗易懂地解释了,"数字签名"(digital signature)"数字证书"(digital certificate)到底是什么。 我对这些问题的理解,一直是模模糊糊的,很多细节搞不清楚。读完这篇文章后,发现思路一下子就理清了...
  • IDSignMSO能够快速生成签名证书,用于软件等数字签名,是软件制作的必备神器!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,266
精华内容 20,906
关键字:

数字签名和数字证书