文件在下载及存储过程中可能由于传输错误、硬件故障、文件系统错误等网络、硬件和软件方面的原因导致文件损坏,也可能在传输过程中受到攻击(如“中间人攻击”)导致下载的文件被篡改或者下载到了其它非原始文件。所以,在使用一个文件之前(如安装一个软件或操作系统)最好先对文件进行完整性(或者说“原始性”)的检验。常用的文件校验方法有SHA、MD5、CRC和PGP签名等。本文主要阐述一下在Linux上使用PGP证书校验文件完整性的操作步骤。

下载提供有PGP证书的文件

这里我们下载的是VeraCrypt(下载地址:点击这里)。我们可以看到,每个文件后面都提供有对应的PGP Signature,下载时我们要把文件和文件对应的PGP Signature都下载下来放到一个文件夹里。

注:下面的操作步骤使用Ubuntu进行演示。需要注意的是,在Ubuntu中不能校验Windows下使用的文件对应的PGP数字签名。如图:

在文件和文件PGP签名所在的文件夹中打开终端

输入gpg -–verify PGP签名文件名

如我这里的PGP签名文件名是“veracrypt-1.21-setup.tar.bz2.sig”(签名文件一般以.sig或.asc结尾),所以我输入的命令就是

gpg –verify veracrypt-1.21-setup.tar.bz2.sig

回车执行后如下图所示。这一步操作的目的主要是为了获取从公钥服务器上下载公钥的“钥匙号”,如图中的钥匙号为“54DDD393”。



但是,在上图中我们可以看到“完好的签名”这一提示,这表明PGP校验已经完成(“gpg -–verify PGP证书文件名”这一命令本身就可以在已经导入公钥的前提下直接校验文件完整性,但是在没有导入公钥时运行这一命令可以使用得到的钥匙号去公钥服务器上下载公钥)。这是因为我之前已经进行过一次检验,公钥已经导入到了本地,下面我们把本地公钥删除,重新进行一次校验。我们可以使用“gpg -k”命令查看当前系统中的公钥:



现在可以知道,公钥pubring.gpg在一个名为“gnupg”的隐藏文件夹里,我们进到这个文件夹里,用rm命令将它删除:



然后再执行“gpg -–verify PGP证书文件名”:



这次的运行后仍得到了钥匙号,但是没有出现“完好的签名”这样的提示,而是“无法检查签名”,这说明本地此时并没有可以用于检验签名的公钥。

注:在这里我们可以看到,我们要验证的是PGP签名,使用的却是“gpg”命令,关于PGP和GPG的更多内容可以查看我的另一篇博文电子邮件加密技术初探

输入gpg –keyserver hkp://pgp.mit.edu –recv-keys 钥匙号

输入gpg -–verify PGP签名文件名



至此,我们看到了“完好的签名”这样的提示,这说明文件本身基本可以保证是完整的。

注:上一步出现了警告“没有找到任何绝对信任的秘钥”,这一步操作也有类似的警告“没有证据表明这个签名属于他所声称的持有者”。也就是说,秘钥本身也是可以被伪造的,PGP签名只是检测文件是否完整的一个参考。PGP签名的原理就是使用非对称秘钥加密技术和数字摘要技术产生一段只有文件的原始发布者才能产生的数字串。我们对文件进行PGP签名校验,就是要使用公钥解密文件的原始发布者使用私钥加密的签名,核对上述中的“数字串”是否和原来一致。为了方便获取公钥,人们一般把公钥上传到公钥服务器中。有时候人们为了防止PGP签名本身被伪造,还提供了SHA256用于对PGP签名文件本身的完整性进行检测。

附:PGP公钥服务器列表:

http://keyserver.ubuntu.com

http://keys.gnupg.net

hkp://subkeys.pgp.net

hkp://pgp.mit.edu

hkp://pool.sks-keyservers.net

hkp://zimmermann.mayfirst.org

有一个网站不断统计着几乎所有公钥服务器上的公钥数目(网站地址:https://sks-keyservers.net/status/),如图:

其实我一直觉得Linux操作系统很难使用,一方面在Windows上常使用的软件很少有支持Linux的,另一方面使用Linux时总会遇到各种障碍。当我学会在Linux上使用PGP证书校验文件完整性之前,我对Linux优势的了解仅仅是占用内存小且开源免费,自从实际操作了PGP证书校验文件我才真正开始感觉到了Linux在处理一些专业任务上的便捷性。

end

更多内容请访问我的个人主页http://zhaokaifeng.com/

在Linux上使用PGP签名验证文件完整性的更多相关文章

  1. 如何在SecureCRT中给linux上传和下载文件 安装redis

    首先建立文件 /download sz和rz命令无法用.则用以下1.和2.3步骤   需要上传或者下载,需要使用rz和sz命令.如果linux上没有这两个命令工具,则需要先安装.可以使用yum安装.运 ...

  2. 在SecureCRT中给linux上传和下载文件

    下载:sz中的s意为send(发送),告诉客户端,我(服务器)要发送文件 send to cilent,就等同于客户端在下载. 上传:rz中的r意为received(接收),告诉客户端,我(服务器)要 ...

  3. 如何在SecureCRT中给linux上传和下载文件

    方法/步骤     需要上传或者下载,需要使用rz和sz命令.如果linux上没有这两个命令工具,则需要先安装.可以使用yum安装.运行命令yum install lrzsz.   安装完成后就可以使 ...

  4. node.js的iconv模块----在linux上读取windows编码文件

    有时候我们在windows上会保存一些中文文字信息文件,然而由于编码集的差异,这文件在linux上显示为乱码,其中一种解决方法是node.js的iconv模块 var fs = require('fs ...

  5. linux上使用wget下载文件

    首次安装的centos操作系统是没有安装wget的,所以首先需要先安装wget,然后才能使用wget下载文件. 1.第一步,保证centos能正常连网.使用命令  :yum -y install wg ...

  6. linux上传、下载文件rz、sz命令

    1.介绍 sz命令是利用ZModem协议来从linux服务器传送文件到本地,一次可以传送一个或多个文件.相对应的从本地上传文件到Linux服务器,可以使用rz命令. 2.参数说明 -a,以文本方式传输 ...

  7. linux上传与下载文件命令

    //文件从Linux系统上传到其他系统. sz空格+文件名 //文件从其他系统下载到Linux系统. rz //之后会弹出路径选择框,选择文件,即可下载到当前路径.

  8. 如何在Linux上恢复误删除的文件或目录

    Linux不像windows有那么显眼的回收站,不是简单的还原就可以了.linux删除文件还原可以分为两种情况,一种是删除以后在进程存在删除信息,一种是删除以后进程都找不到,只有借助于工具还原,这里分 ...

  9. linux上改变mysql数据文件的位置

    用软连接改变了/var/lib/mysql的位置,并设置好mysql.mysql的权限,但是发现还是不能启动. 发现/var/log/mysqld.log 150308 16:16:02 [Warni ...

随机推荐

  1. mtk camera 移植步骤

    mtk camera 移植步骤: 1, Kernel层驱动代码文件添加 /mediatek/custom/doov92_wet_tdd/kernel/imgsensor/下添加imx179_mipi_ ...

  2. Developing User Interfaces

      Developing a User Interface with ADF Faces Purpose This tutorial covers developing the user interf ...

  3. linux服务搭建----ssh服务开启

    //ssh  服务     ssh 192.168.88.254         如何开启   service sshd restart     关掉该服务 servicesshd stop     ...

  4. AngularJS进阶(七)实现根据不同条件显示不同控件

    AngularJS实现根据不同条件显示不同控件 由于项目需求,需要实现根据不同条件显示不同控件的功能.具体要求如下图所示: 即当选择"每单固定减"时,下方只显示"减免金额 ...

  5. jquery.query-*.js 操作url

     做的项目中需要用到通过JS获取GET参数,上网找了一下,找到如下插件: 例如 当前你的URL是: http://www.xxx.com/index.php?test=1&kk=2 如果想 ...

  6. 不错的网络协议栈测试工具 — Packetdrill

    Packetdrill - A network stack testing tool developed by Google. 项目:https://code.google.com/p/packetd ...

  7. 基于友善之臂ARM-ContexA9-ADC驱动开发

    ADC,就是模数转换器,什么是模数转换器? 模数转换器,在电子技术中即是将模拟信号转换成数字信号,也称为数字量化. 当然还有一种叫DAC,就是数模转换,意思相反,即是将数字信号转换成模拟信号. 在友善 ...

  8. SharePoint2007 管理中心TimerJob”计时器作业定义”页面报错

    部署完成自己开发的TimerJob,发现"计时器作业定义"页面报错,进不去了,但是TimerJob可以正常运行,这样,肯定不行的,估计还是代码有问题,把这个脆弱的sharepoin ...

  9. ARP 协议抓包分析

    ARP(Address Resolution Protocol)- 地址解析分析 ARP 协议是根据IP地址获取物理地址的一个TCP/IP协议. 当PC1 想与 PC2 进行通信时,需要同时知道PC2 ...

  10. JDK内置工具之一——JMap(java memory map)

    1.介绍 打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量). 可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本.使用方法 j ...