利用 gunpg 进行数字签名

gnupg 可以用于加密文件,生成公钥对并对文件进行签名,给公钥颁发证书(即用你的私钥对公钥签名)。

                             (图片出自《图解密码》)

     比如 公司A 编写了一个动态链接库DLL,并在公司主页给出下载地址。 这时 公司B 需要使用 公司A

提供的动态链接库,公司A 的服务器没有使用 https 协议加密传输的数据,所以与公司A的通讯很有

可能遭到中间人攻击,传输到 公司B 的动态链接库可能被中间人替换成恶意DLL,导致 公司B 遭到进一步

的网络攻击。

     因此,公司B 需要验证下载的动态链接库是不是真的由 公司A 发布的。这时候就需要用到数字签名技术。

公司A生成公钥对,其中私钥用来签名动态链接库的散列值,而公钥则发布到网络中,给大家用来验证

数字签名。但如何确定公司A发布公钥就一定属于公司A呢?这时候就需要 公司A 向一个可信任的第三方

申请证书。 这个可信任的第三方就是 公司A 公司B 都信任的另一个 公司C公司C用它的私钥对

公司A 的公钥进行签名(颁发证书),这样 公司B 就可以用 公司C 的公钥来验证 公司A 的公钥是否真的属于

公司A 了。   好像有点绕,用现实的一个例子来说明一下,比如我们下载了 微信 的安装包,但是我们处于

一个不安全的wifi环境中,下载的安装包很有可能是被替换过的(具体怎么替换的就不举例了),这时候

我们就需要查看他的签名了。 右键查看安装包属性,打开数字签名栏:

查看详细信息->查看证书:

     可以看到由 可信任的第三方 VeriSign 公司 颁发给 腾讯公司 的证书还在有效期内。

在这个实例中, VeriSign就是公司C,腾讯公司就是公司A,而使用者(我)就是公司B。

公司B 验证了 公司A 的证书,这样就可以确定,这个安装包的确是由腾讯公司生成的。

这里有个问题就是,我们可以确定证书由 公司C 颁发的,并且也有效,但为什么要相信

公司C 呢? 这就属于社会效应了,为什么我们要把钱存到银行?因为我们相信银行一般

不会把我们的钱弄丢……同理,公司C 在社会上的口碑好,大家都信任它,所以由它

颁发的证书也是值得相信的。

     数字签名的利用了非对称加密算法来实现对消息的完整性、不可否认性的保证。

只有持有私钥的人才能生成对应的消息签名, 这就保证了消息的不可否认性。任何持有公钥的人,

都可以对消息签名进行验证,如果消息遭到了篡改,那么用公钥解密出来的数据就一定是错的。

原理就是这样的,具体的过程大致是:

A.签名并申请证书

1.计算消息(程序、文件)的哈希值

2.用私钥对哈希值进行签名,得到签名文件

3.向第三方申请证书 ,第三方用它的私钥对申请者的公钥签名,得到由第三方颁发的证书。

B.验证签名

1.向第三方索取第三方的公钥验证证书,如果证书有效,则表明对应的公钥是有效的。

2.计算获取的消息的哈希值,同时用公钥解密签名。

3.对比解密后的哈希值与计算得到的哈希值,相同则表明消息(程序、文件)是由持有公钥的

实体(人、公司)发送的,并且也没有遭到篡改。

//******************************************************************************//

      以上就是对数字签名、证书的基本介绍了,下面演示如何使用开源工具gnupg生成签名,

对签名颁发证书……实例: 公司A编写了一个动态链接库downloadOnPlay.dll ,并对DLL的

SHA-256散列值进行了签名。 公司B下载了公司A主页上发布的DLL文件,但是由于 公司B的

网络环境不够安全,或者公司A的服务器遭到了入侵,这时公司B就要通过数字签名技术确认

下载的DLL的确是公司A发布的并且没有遭到篡改。

公司A:
1.生成公钥对,这里会要求输入用户名、邮箱、以及用于加密私钥的密码。
gpg.exe --generate-key

 

成功生成公钥对(用 --full-generate-key 参数可以选择更多的参数来生成公钥对):

2.计算 downloadOnPlay.dll 的SHA-256 散列值(使用sigcheck程序):

sigcheck -h d:\test\downloadOnPlay.dll

2.把SHA-256 的散列值保存到另一个文件中,并用指定的用户ID(uid)对文件签名,

生成 .pgp 签名文件,使用私钥签名时会要求输入密码(解密私钥用的)。
gpg --sign -u "amazing" d:\test\sha256.txt

对应的目录下可以看到生成的签名文件:

3.导出公钥到文件
gpg --export -u "Amazing" --armor > d:\test\amazing_pub

公司B:

1.下载downloadOnPlay.dll文件,下载签名文件 sha256.txt.pgp,下载公司A的公钥。

2.导入公司A的公钥

gpg --import e:\test\amazing_pub

3.用公司A的公钥解密签名文件

gpg -d e:\test\sha256.txt.gpg

可以看到第一行就是DLL的SHA-256散列值。

4.计算DLL的SHA-256散列值,并与解密得到的散列值对比。

相同,说明这个DLL的确是公司A发布的,并且没有遭到篡改。

     这里需要说的是,我们得到的公司A的公钥有没有遭到篡改呢?这里就需要第三方颁发证书了,

原理是一样的,也就是用第三方的私钥给公司A的公钥加上数字签名,就不在演示了。

好了,以上就是对 gnupg 的使用以及数字签名的介绍了。

猜你喜欢

转载自blog.csdn.net/cwg2552298/article/details/82669592
今日推荐