数字签名

背景

我们的应用程序用inno setup打包后,在xp上运行时候提示未知的发行者,为了解决这个问题,所以才有了今天这篇记录,当然自己创建的证书是不被操作系统认可的,签名的过程其实跟https差不多。

  1. 让我想想,该从哪里开始呢?先说说数字签名是什么?
1. 签名,顾名思义就跟在签字画押一样,签上后,这就是自己身份的证明了。
2. 为什么要签名呢,这是因为在网络上传输信息是开发的,透明的,发送方和接收方其实是不知道传输的信息是不是给自己的,所以就需要签名来确认身份。
3. 签名具有防止篡改,重放,伪造等性质。
4. 篡改主要是因为签名和原文件混合在一起,是一个整体,没法分开。
5. 重放主要是通过时间戳等技术实现的。
6. 伪造,因为在签名的过程中私钥只有自己知道,所以签名是没办法伪造的,公钥和私钥这种属于非对称加密,而信息在传输的过程中也会加密,这个时候就用的是对称加密了。
7. 非对称加密,加密和解密使用不同的密钥,如果使用公钥加密,那么只有私钥解密,反之亦然(RSA / DSA)。
8. 对称加密,加密和解密使用相同的密钥,相比较非对称加密,效率能高点,速度快(DES / IDEA)。
9. 信息摘要:对数据进行处理,得到一段固定长度的结果,在进行数字签名时,需要先对文件使用HASH算法计算其信息摘要,然后对该摘要值进行数字签名。信息摘要的特点有,输出长度固定,不可逆转,对输入数据敏感(即使数据变化很小,信息摘要签名后也会有明显的变化),防碰撞。一般情况下,都是对文件的摘要信息进行计算得到摘要值,然后在网络传输的过程中验证其摘要值,也是因为其有这几个特点,基本上可以保证一个文件的数据完整性。
10. 签名的原理:
 1. 传输的信息按双方约定的HASH算法计算得到一个固定位数的信息摘要。
 2. 信息摘要用私钥加密,也就是数字签名以及原传输信息一起发送给接收者。
 3. 接收方收到数字签名后,用同样的HASH算法对信息计算摘要值,然后将数字签名用发送者的公钥进行解密,并与报文摘要值相比较,如相等则说明报文确实来自所称的发送者。
  1. 但这里也有几个问题:

    1. 发送方公布自己的公钥,那么所有人都能拿到公钥,这个时候,发送方加密的东西,理论上所有都可以解密。
    签名的过程中,需要用对称加密的算法,加密双方传输的消息,这样就可以保证消息的安全。
    
    1. 发送放公布自己的公钥,那么其他人如何拿到这个公钥呢,如何防止公钥不被篡改,理论上每个人都可以发布自己的公钥,那这样如何保证消息的安全呢。
      这个时候就需要一个权威的机构来管理了,大家都相信它,由它给发布公钥的人颁布一个数字证书,这样接收者接受到消息就可以去这个机构验证发送着的身份。
    
  2. 数字证书,一个数字证书大概包含下面几个(这里就简单说下,具体的认证过程等就不说了):

    1. 证书的发证机构
    2. 证书的有效期
    3. 公钥(数字证书是可以保证里面的公钥就是证书持有人的)
    4. 签名算法
    5. 指纹,指纹算法


      image-20191203124201473.png
      image-20191203124236806.png
      image-20191203124312590.png
这里大概说下指纹和指纹算法:
这个是用来确保证书没有被修改过,在发布证书时,发布者根据指纹算法(一个hash算法)计算整个证书的hash值(指纹)并和证书放在一起,使用者在打开证书时,自己也根据指纹算法计算一下证书的hash值(指纹),如果和刚开始的值对得上,就说明证书没有被修改过,因为证书的内容被修改后,根据证书的内容计算的出的hash值(指纹)是会变化的。 注意,这个指纹会使用”SecureTrust CA”这个证书机构的私钥用签名算法(Signature algorithm)加密后和证书放在一起。
为了保证安全,在证书的发布机构发布证书时,证书的指纹和指纹算法,都会加密后再和证书放到一起发布,以防有人修改指纹后伪造相应的数字证书。这里问题又来了,证书的指纹和指纹算法用什么加密呢?他们是用证书发布机构的私钥进行加密的。可以用证书发布机构的公钥对指纹和指纹算法解密,也就是说证书发布机构除了给别人发布证书外,他自己本身也有自己的证书。证书发布机构的证书是哪里来的呢?这个证书发布机构的数字证书(一般由他自己生成)在我们的操作系统刚安装好时(例如windows xp等操作系统),这些证书发布机构的数字证书就已经被微软(或者其它操作系统的开发机构)安装在操作系统中了,微软等公司会根据一些权威安全机构的评估选取一些信誉很好并且通过一定的安全认证的证书发布机构,把这些证书发布机构的证书默认就安装在操作系统里面了,并且设置为操作系统信任的数字证书。这些证书发布机构自己持有与他自己的数字证书对应的私钥,他会用这个私钥加密所有他发布的证书的指纹作为数字签名

数字签名

大概知道了签名是怎么回事,那么也明白自己创造的证书是不被认可的,这里只是做一个记录学习。最近由于工作原因一直在windows下开发(很头疼),windows下我们给软件签名用到的工具大概有下面几个。

  1. Signtool 签名工具 参考

  2. makeCert 生成证书工具 参考

  3. cert2spc cert转spc文件 参考

  4. Pvk2pfx 参考

makecert.exe -sv "c:/spmc.pvk" -r -n "CN=北京软件技术有限公司" c:/spmc.cer
    ​
cert2spc.exe c:/spmc.cer c:/spmc.spc
    ​
pvk2pfx -pvk c:/spmc.pvk -pi 123456 -spc c:/spmc.spc -pfx c:/spmc.pfx -f
    ​
##### 命令测试
signtool sign -v  -f C:\spmc.pfx -p 123456 C:\Users\chujiu\Desktop\SUPD02.100.00948\setup.exe
    ​
signtool timestamp -t http://timestamp.digicert.com  C:\Users\chujiu\Desktop\SUPD02.100.00948\setup.exe
    ​
    ​
##### inno setup实战
"C:\progra~2\Windows Kits\10\bin\10.0.18362.0\x64\signtool.exe" sign /v  /f C:\\spmc.pfx /p 123456 /t http://timestamp.digicert.com  $f

上面所有的命令行窗口必须用visual studio 命令行工具打开,具体可以参考https://docs.microsoft.com/zh-cn/dotnet/framework/tools/developer-command-prompt-for-vs 微软官网。

如果系统中没有安装sdk,https://developer.microsoft.com/zh-cn/windows/downloads/sdk-archive官网可以下载安装。

Inno setup 参考

记得签名的结尾一定要带上$f。具体的可以参考官方的文档。
时间比较紧张,记录的也比较粗糙,有时间好好整理下。


image-20191203132627143.png

你可能感兴趣的:(数字签名)