什么是PGP
PGP是Pretty Good Privacy,一个用来加密和解密数据和管理密钥的工具。由于PGP是商业软件,所以现在大家一般用 GPG(GnuPG),GPG是一个自由软件,功能和PGP是兼容的。
PGP(GPG)是目前使用最广泛的消息加密、解密方案。如果你还没有听说过,那你就真是有点跟不上时代了。
什么是公钥密码学
一般生活中常见的锁,必须使用同一把钥匙开启和关闭。有人构造了一种新锁,这种锁可以用钥匙A(公钥)关闭,再用钥匙B(私钥)开启,或者用钥匙B关闭,用钥匙A开启。用计算机程序模拟这种锁,完成数据的加密和解密,这个学科就叫公钥密码学(public key cryptography)。
公钥密码学的好处是,你可以把钥匙A(公钥)发给所有人,他们用钥匙A加密信息之后发给你,你再用钥匙B(私钥)解开。那些拿到公钥A的人,是无法从公钥推敲出你的私钥的,所以你只要保护好你的私钥,就可以安全地和其他人进行加密的通信。
PGP(GPG)软件可以帮你生成公钥和私钥,可以帮你方便地加密和解密消息。
什么是数字签名
在互联网上发东西,经常会遇到身份确认的问题。
比如有个叫新品葱的网站,就经常以“我觉得你被人盗号了”作为理由,封禁他们网站上的用户。
怎么证明你是你自己,而不是别人冒充的呢?密码是一个办法,但是你登录的时候会把密码发给网站,所以网站的工作人员就可以知道你的密码,然后把你的密码卖给别人,用来登录你其他的网络服务,比如邮箱或者网银之类的。(为了应对这种情况,2047登录时会先在用户的浏览器上对密码作hash,因此除非用计算机暴力猜解,否则网站工作人员是无法获取用户的密码的。)
密码泄露是个大问题,而公钥密码学可以解决这个问题。你先用你的私钥,加密一条信息,让别人用你的公钥解开。由于只有你自己有私钥,所以别人通过这个解密的过程,就可以确认消息确实是你加密的(而不可能是别人假扮成你加密的),这种做法就叫“签名”,现在是数字时代所以叫“数字签名”。网站验证完你的签名,就可以让你登录了。
用数字签名登陆网站,比用密码登陆要安全得多,生活在大陆的朋友可能用过银行、软件公司或者网游公司做的那些U盾、密保器,生活在国外的朋友可能用过Google Authenticator,还有门禁解锁的RFID卡,这些其实都含有基于数字签名的身份验证技术,只不过是把私钥放到了一个小盒子里面。用电脑来做这个事情的话,私钥就放在电脑上的一个文件里面,原理是一样的。
搞这么复杂的必要是?
取决于每个人面临的威胁模型。
- 如果假设网站永远不会出卖用户,用密码登录就是安全的。
- 凡是用密码登录的网站,只要站长愿意,100%是可以记录用户的密码的,然后他可以拿这些密码去做他想做的事情。所以只要网站有出卖用户的可能性,密码就不再安全了,必须每个不同的网站用不同的密码才相对安全。
- 如果你遇到更严重的threat,比如 @蒹葭苍苍 那种被人怀疑甚至假冒身份的情况,需要证明自己就是某个无法登陆的账号的持有者的时候,仅有密码也没用,那就需要公钥密码学了。
- 因为公钥是包含在2047的数据备份中的,所以如果有一天2047倒闭了,其他人用数据备份还原一个新的2047出来,老用户就不需要重置密码,用公钥签名就可以登录自己的账号了。
- 别人给你发站内信的时候,可以用你的公钥加密。
用PGP签名登陆2047
步骤如下
-
首先你肯定要获得属于你自己的公钥和私钥,它们是成对使用的,又叫做“密钥对”(key-pair)。要生成这样的key-pair,可以使用GPG软件。
Windows用户需要安装Windows版的
gpg
软件,见https://gpg4win.org/download.html。linux和 Mac用户通常系统里已经有gpg了。不同版本的gpg,提供的操作选项是不一样的,上面那个windows的,我安装完是gpg2.2版;在ubuntu 16.04上面的gpg,是1.4版的。输入
gpg --version
即可查看版本号。在ubuntu上如果要升级,要sudo apt install gnupg2
,使用的时候要把gpg
替换为gpg2
-
打开命令行终端,输入
gpg --gen-key
,然后按照提示操作,即可生成自己的公钥和私钥,请记得把Real name
填写为你在2047的用户名。通过上面的方法,GPG2.2版本生成的公钥,默认是3072位(bit)的RSA公钥。你可能会问,为什么这个密钥这么长?
一般来说,如果密钥是一个随机数,那么128位随机数就已经几乎不可能用计算机去暴力猜解了,为什么RSA要3072位呢?
真正的原因是,RSA公钥本质上是两个大质数的乘积,而质数的分布并不是稠密的,因此需要更长的密钥长度来弥补这个稀疏性。根据维基百科的说法:https://en.wikipedia.org/wiki/Key_size
1024-bit RSA keys are equivalent in strength to 80-bit symmetric keys, 2048-bit RSA keys to 112-bit symmetric keys, 3072-bit RSA keys to 128-bit symmetric keys, and 15360-bit RSA keys to 256-bit symmetric keys.
可以看到,RSA密钥的安全性,并不是随着密钥的长度线性增加的,这是因为质数越大越稀疏。为了实现等效于128bit的安全性(相当于2的128次方猜解难度),RSA密钥长度必须是3072位。
幸运的是,密码学家们已经提出了比RSA更好的公钥加密算法,比如椭圆曲线算法,密钥长度更短(128bit安全性时密钥长度只有256bit)。
要使用这些高端大气的加密算法,必须使用2.0以上版本的GPG,生成keypair的命令是
gpg(or gpg2) --expert --full-gen-key
,然后按照提示操作,密钥类型选ECC and ECC
,曲线类型选NIST-384。 -
现在key-pair已经生成了,以二进制的形式存在你电脑的某个地方,我们需要把它导出为文本格式,命令是
gpg --export -a <你刚才创建密钥时输入的名字>
,例如gpg --export -a thphd
。注意,如果不指定名字,就会导出所有公钥,而不是只导出某个名字下的公钥,长度会非常长
命令输出如下:
(384-bit ECC,所以非常短)
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2
mG8EX2PKZhMFK4EEACIDAwSl4dYPNEuzs8taLGu4VnkO8oCP+Z/NcbYUTHMj+mXC
xuPeSus/XlA9qbf5PoD1MCRcVzGpKPvcdGBmd76uNkEZlWy/3V11mWNDpIeM21zI
odb1rnN/yYEdJmWFm34rlg+0BXRocGhkiJkEExMJACEFAl9jymYCGwMFCwkIBwIG
FQgJCgsCBBYCAwECHgECF4AACgkQT1uG/dPJ4OxAAgGA3/O7KxftugoV34ef5+Fd
Ay6ase8dreDxTq48f63Oafv8AaqLKBoTQ3RX68x9C8gNAX9Guhcl8fKRSSa2NOqb
5iaUXrIhsbDYjgXd6S1VlIaGqnL+WVRNZGJdPlyx6Y9PSH24cwRfY8pmEgUrgQQA
IgMDBKc9OpX85WzEyI1rEckrua/aR02ril0rNszmVEhF7k+kjvLFIHFlbEFkjUbb
1stAkhPtnhF1pIyIxxvlr5wd1ys23RB+ej8UKNORXPxgXRmjxDT47GbQROFJE0lK
6Z8aWAMBCQmIgQQYEwkACQUCX2PKZgIbDAAKCRBPW4b908ng7KdUAYDyESGHaqCa
to22FarvjQLzI1QdEA89k3q0Dc1Gjnnceed1vbRFgKHupL0JyudGeNMBf23Oh7pG
mFpzgj0sklaVwbSynSabTbo6YmGkjbq8gI9j+Diix9DX/zhkpnrdQB7ZOw==
=vCbI
-----END PGP PUBLIC KEY BLOCK-----
-
把这个文字版的公钥,上传到2047网站, 方法见/t/7479
-
检查一下自己的个人主页是否显示“公钥”的链接
-
退出2047账号,按照登录界面提示操作即可。
步骤在此强调一下:
- 登录界面,输入你的用户名
- 登录界面的黄色框中,会出现一串命令,把这串命令复制下来,用Windows CMD或者Linux/Mac 终端运行
- 运行结果整个复制黏贴到登录界面的白色框中,再点“用PGP签名登录”。