zoukankan      html  css  js  c++  java
  • 数字签名与数字证书

      此随笔是看了一位博主,觉得还蛮有趣的,记录一下。原博客:https://blog.csdn.net/qq_21514303/article/details/82898984

      这里自己也试着描述一下,看看自己是否真的理解了:(下面的例子都是原博主举例的)

      假设:甲有一把隶属于自己的公钥和一把私钥,分别将公钥给乙丙两人,任何一个人想给甲发送保密的信,用甲所给的公钥进行加密,就可以对外人起到保密的作用,因为只有甲的私钥才可以对甲的公钥进行解密。所以,如果甲的私钥一直都是处于安全状态,所有用甲的公钥发送给甲的文件都是安全的,其他人没有甲的私钥也解读不了。过程:乙使用甲的公钥进行加密,甲收到乙的信件用自己的私钥解密,并且通过hash函数生成回信的摘要并且用自己的私钥加密进而生成“数字签名”,再将此数字签名跟回信一起发给乙。乙收到之后,用甲的公钥将信件的数字签名进行解密,同样用hash函数对信件得到其摘要,前后摘要一对比,就可以确定这封信是否有过修改。

      这里曾经对使用的hash函数有过怀疑:甲乙双方是否有提前通过气——使用同样的hash函数对信件提取摘要。但是经过思考:这里使用hash函数的目的是为了判断是否有人窃取并修改信件,因为数字签名是由甲的私钥生成的,得用甲的公钥才能解,所以是否有人修改,乙只需要用同样的hash函数得到摘要,再与数字签名一对比就知道了。但是,如果用的是不同的hash函数,是否就会生成不同于甲所生成的数字签名,从而影响判断:这封信的内容是否有人动过?

      可能还会有人问:拥有甲的公钥不止是乙一个人,丙一样有甲的公钥,一样可以窃取内容。窃取可以窃取,但是即使修改,作用也不大,因为就算可以解密,并且修改信件内容,也没办法重新生成新的数字签名,因为没有甲的私钥。所以,即使修改了,乙到时候一对比原来的数字签名,就知道有人修改了。但是还是存在着被拥有甲的公钥的其他人所窃取内容。

      但是,应该来说,信件已经生成了摘要,摘要应该包含所有要说的重点,乙只需要解密数字签名后,阅读摘要就行了,即使修改了信件,也应该问题不大吧,因为摘要的信息我都已经知道了。至于hash函数这个应该不是重点,因为如果拥有甲的公钥的人,一样可以窃取到摘要的内容,而没有甲的私钥,修改很明显会被发现,自然不会再画蛇添足。

      从上面的例子可以看出:数字签名可以视为一种内容真假的判定依据,是通信双方之间采取的一种增加通信安全的措施。

      但是,还是有漏洞:如果乙丙所持有的甲的公钥被其他人破坏/修改了呢?例如:丁攻击或者偷偷将乙所持有的甲的公钥换成自己的公钥,那么,乙不知道,正常发送信件,但是信件是发送到丁那里,而丁可以使用自己的私钥对信件进行解密。甲所能做的,丁都能做,那么甲乙之间的通信就会变成丁乙之间的通信,那么乙收到的所有不是甲的,这样,丁就可以达到传达错误信息给乙的目的了。如果乙有所觉悟,发现不对劲,那么乙可以要求甲去“证书中心”做公钥认证,证书中心用自己的私钥对甲的公钥和一些相关信息一起加密,生成数字证书。这样子,甲再给乙发信息的时候,只要在签名的同时,再附上数字证书就行了。因为乙可以用证书中心的公钥解开数字证书(拥有甲的公钥的其他人解不开),从而证明“数字签名”是由甲签的——这是原博主的说法,但是我觉得不是这样的:难道做一个公钥认证,只是为了证明数字签名是不是甲签的吗?不应该是这样的吗:相当于在原本的公钥基础上再加多一层保护,避免那些原本拥有甲的公钥的人窃取信息。或者可以理解为,更改了公钥,使像丁这些原本持有甲的公钥的人不能窃取到甲乙之间的通信。因为数字签名是由甲的私钥加密生成的,那么除非,呃呃,知道了:原博主的意思是想验证乙手中的公钥是不是甲的公钥,而不是想防止信件是否有被窃取。但其实数字证书都具有上述两种效果。

  • 相关阅读:
    thinkphp3.2新部署是错
    淘宝code
    面试感悟----一名3年工作经验的程序员应该具备的技能---转载
    【海量之道】海量之道之SET模型
    看过年人流高峰,浅聊并发之战[架构篇]
    docker启动遇到的问题
    监听数据配置
    Python+requests+unittest+excel实现接口自动化测试框架
    冒泡排序及优化
    jmeter监控的一些插件
  • 原文地址:https://www.cnblogs.com/yangrongkuan/p/12488912.html
Copyright © 2011-2022 走看看