关于数字签名

论坛 期权论坛 期权     
啐啐念   2019-10-27 05:53   3276   0


看到签名,首先第一反应是想到现实世界的签名,在数字世界里面可以如此类比,现实世界的签名是为了保障唯一、确认的意思,在数字世界同样有这样含义,还有其他用途。
下面详细阐述。
一、数字世界的问题
在数字世界里,如果进行信息传输,除了加密问题,还存在三个重要问题:
1、完整性:
保证传输的数据是没有丢失的,没有被删除,举个例子你通过银行转账5000元,你不希望数字在传输过程中丢个0吧。

2、防篡改:
这里面的防窜改和完成性容易误解,数据是完整的但是可能被篡改,同样你转账5000元给小明,篡改可以将整个信息做替换,比如将整个信息替换为你转账50000万元给小刚。

3、防抵赖:
数字世界里面,由于没有指纹识别,发送的信息容易被抵赖,还拿你转账5000元给小明的例子,如果银行没有相关的令牌验证,你对此事可以抵赖,你说这个不是我在网上发起的转账,可能是黑客干的吧。

如何解决这三个问题,计算机科学家早就想到了对策,那就是数字签名,我们平时上网地址中有https开头的网站、我们登录网银的时候的令牌、均含有此项技术,下面具体看看数字签名。


二、签名的原理
1、完整性保证
如果你有心留意,我们在网上下载软件的时候,有的软件带有校验码,校验码的作用是为了防止软件被黑客破坏,在里面植入木马等。
那一串类似数字的验证码:e10adc3949ba59abbe56e057f20f883e  通过对特定的软件可以对下载的文件进行校验,如果得到的校验值和网站提供的是一致的,说明没有被破坏,当然如果连校验码都被改了那就没办法了。
原理就是Hash算法、用简单的数学公式来表示为: hash值 = f(原始数据)
也就是对原始数据按照特定函数进行求值,得到一串hash值,这个特定函数f称为hash函数。
这个函数有如下特点:
1)无论原始数据多长,生成的hash值都是很短的一串数字和字母组成的值。
2) 无论原始信息发生了多微小的变化,生成的hash值都会有很大的不同。
3) 很难找到两个原始值不一样,但是hash值相同的情况。

通过Hash算法,其实就保证了数据的完整性,当然还没办法保证防篡改,假如黑客把数据和校验码都替换了,则是不安全的。

2、防篡改和防抵赖的保证
对于这两个问题的保证是通过一种叫非对称加密算法来保证的,简单来分数字世界的加密算法分为对称加密和非对称加密,对称加密的意思是加密和解密用的是相同的密钥,非对称加密算法就是加密和解密用的密钥不是同一个,是一对,称为公钥和私钥,一般公钥是公开的,私钥要自己保密保存。这里面的密钥一般是类似于我们用的密码,实际是一串数字或一组参数。


        

      

                                                 【对称加密算法】



        

      
                                              【非对称加密算法】

非对称加密算法,除了加解密功能,还有个功能就是做数字签名,原理如下图:

        

        





   

                                                     【数字签名】
说明:
1)这里面用的签名密钥是非对称加密里面的私钥。
2)数字签名同时包括了HASH算法、所以保证完整性。
3) 流程说明:对用户的明文数据按照特定的摘要算法进行HASH运算,得到的是摘要值,用用户的私钥结合签名算法对摘要值进一步计算生成签名值,最终的信息是签名值和明文的组合。


签名的校验流程如下:


        
      
                                                   【签名校验流程】

说明
1) HASH算法是和前面的时候用的同一个,这个是公开的。
2) 签名的算法也是公开的,签名的公钥也是公开的。
3) 流程很简单,通过公钥结合签名算法将签名值还原成摘要值,再对明文进行相同的HASH算法形成摘要,比较两者,相同的摘要值,说明签名校验通过。

总结:
1)由于过程中使用了HASH算法,则保证了数据的完整性。
2)防抵赖保证:假如用A用户的私钥进行签名,只有A用户的公钥可以查看,这个是唯一的,公钥是公开的,这样大家都可以用这个公钥来校验是不是A用户的签名,如果用A用户的公钥可以校验这个签名,那么一定是A用户签名的,这就防止了抵赖性。
3)防篡改保证:其他用户非A用户是不可能有A用户的私钥的,如果篡改了信息,也没办法进行用A用户的私钥进行签名,这就保证了防篡改性。


三、利用Openssl签名例子
1)生成RSA密钥对
  1. openssl genrsa -out rsaprivatekey.pem 1024
复制代码

2)  从密钥对里面导出公钥
  1. openssl rsa -in .\rsaprivatekey.pem -pubout -out rsapublickey.pem
复制代码
3) 利用私钥钥对普通文件plain.txt进行签名
  1. openssl dgst -sha256 -sign .\rsaprivatekey.pem -out signature.txt  .\plain.txt
复制代码
利用sha256Hash算法,最终的签名文件为signature.txt  

4) 利用公钥对前面进行校验

  1. openssl dgst -sha256 -verify rsapublickey.pem -signature .\signature.txt .\plain.txt
复制代码
输出:Verified OK




备注
  • 文中的图片来自《深入浅出HTTPS》 侵权告知即删除
  • 参考《深入浅出HTTPS》

祝大家一切安好!

                              明翼 2019年8月28日于成都
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP