pgp/gpg相关¶
PGP:
信任网(web of trust)
要点: 不依赖认证机构,而是建立每个人间的信任关系
场景:
* 1. 通过自己的数字签名确认
* 2. 通过自己完全信任的人的数字签名确认
* 3. 通过自己有限信任的多个人的数字签名确认
其他命令:
gpg --version
// 生成密钥
> gpg --gen-key
基本命令使用¶
1.生成key:
$> gpg --gen-key
//之后会要求输入一些个人信息
显示:
gpg: key A250EE4B marked as ultimately trustedpublic and secret key created and signed.gpg: checking the trustdbgpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust modelgpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1upub 2048R/A250EE4B 2018-07-20 Key fingerprint = D619 878B 3657 16EC ECC9 D72C DB76 2EDA A250 EE4B
uid Gordon (This just a test gpg) <gordon@163.com>
sub 2048R/FA6A273C 2018-07-20
说明:
A250EE4B: 用户ID的hash,可以代替用户ID
2.列出key列表:
$> gpg --list-keys
显示:
/home/pzsh/.gnupg/pubring.gpg
-----------------------------
pub 2048R/A250EE4B 2018-07-20
uid Gordon (This just a test gpg) <gordon@163.com>
sub 2048R/FA6A273C 2018-07-20
说明:
第一行显示公钥文件名(pubring.gpg)
第二行显示公钥特征(2048位,Hash字符串和生成时间)
第三行显示"用户ID"
第四行显示私钥特征
3.生成一个撤销证书,以便以后密钥作废时,请求公钥服务器撤销你的公钥:
$> gpg --gen-revoke [用户ID]
4.删除密钥:
// 删除私钥
$> gpg --delete-secret-keys [用户ID]
// 删除公钥
$> gpg --delete-key [用户ID]
5.签名:
5.1对文件签名:
// 在当前目录下生成一个名为<filename>.asc的文件
// --clearsign参数表示生成ASCII形式的签名文件
$> gpg --clearsign filename
// 在当前目录下生成一个名为<filename>.gpg的文件
// 使用--sign参数表示以二进制形式存储
$> gpg --sign haha.txt
// 生成单独的签名文件,与文件内容分开存放,可以使用detach-sign参数
gpg --detach-sign demo.txt
// 如果想采用ASCII码形式,要加上armor参数
gpg --armor --detach-sign demo.txt
5.2签名+加密
gpg --local-user [发信者ID] --recipient [接收者ID] --armor --sign --encrypt demo.txt
5.3验证签名
gpg --verify demo.txt.asc demo.txt
6.输出密钥:
// 公钥文件(.gnupg/pubring.gpg)以二进制形式储存,armor参数可以将其转换为ASCII码显示
// --output: 参数指定输出文件名(public-key.txt)
// --export: 指定哪个用户的公钥
gpg --armor --output public-key.txt --export [用户ID]
// 输出私钥
gpg --armor --output private-key.txt --export-secret-keys
7.上传公钥:
// 公钥服务器是网络上专门储存用户公钥的服务器
// 通过交换机制,所有的公钥服务器最终都会包含你的公钥
gpg --send-keys [用户ID] --keyserver hkp://subkeys.pgp.net
// 生成公钥指纹
gpg --fingerprint [用户ID]
8.导入密钥:
gpg --import [密钥文件]
为了获得他人的公钥,可以让对方直接发给你,或者到公钥服务器上寻找:
$> gpg --search-keys [用户ID]
9.加密文件:
--recipient: -r
--output: -o
--encrypt: -e
$> gpg --recipient [用户ID] --output <file.encrypt> --encrypt <file.txt>
10.解密文件:
$> gpg --decrypt <file.txt> --output <file.encrypt>
// GPG允许省略decrypt参数(下面2句相同)
$> gpg --decrypt <file.encrypt>
$> gpg <file.encrypt>
// 解密后的文件内容直接显示在标准输出
11.验证文件完整性:
# gpg --verify haha.txt.asc
实例1验证加密文件完事性:
1.下载安装文件:
curl -LO https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-3.4.9.tgz
2.下载public signature文件:
curl -LO https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-3.4.9.tgz.sig
3.下载并导入key文件:
curl -LO https://www.mongodb.org/static/pgp/server-3.4.asc
gpg --import server-3.4.asc
4.验证:
gpg --verify mongodb-osx-ssl-x86_64-3.4.9.tgz.sig mongodb-osx-ssl-x86_64-3.4.9.tgz
实例2:生成验证公私钥并签名:
@todo
历史:
1991年,程序员Phil Zimmermann为了避开政府的监视,开发了加密软件PGP
因为这个软件非常好用,迅速流传开来成为许多程序员的必备工具
但是,它是商业软不能自由使用
所以,自由软件基金会决定,开发一个PGP的替代品取名为GnuPG,因此GPG就诞生了
GPG是GNU Privacy Guard的缩写,是自由软件基金会的GNU计划的一部分
它是一种基于密钥的加密方式,使用了一对密钥对消息进行加密和解密,来保证消息的安全传输
一开始,用户通过数字证书认证软件生成一对公钥和私钥
任何其他想给该用户发送加密消息的用户,需要先从证书机构的公共目录获取接收者的公钥
然后用公钥加密信息,再发送给接收者
当接收者收到加密消息后,他可以用自己的私钥来解密,而私钥是不应该被其他人拿到的