文章

什么是公钥密码学、PGP、数字签名;用PGP签名登录2047

thphd  ·  2020年9月17日 2047前站长

什么是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

步骤如下

  1. 首先你肯定要获得属于你自己的公钥和私钥,它们是成对使用的,又叫做“密钥对”(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

  2. 打开命令行终端,输入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。

  3. 现在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-----
  1. 把这个文字版的公钥,上传到2047网站, 方法见/t/7479

  2. 检查一下自己的个人主页是否显示“公钥”的链接

  3. 退出2047账号,按照登录界面提示操作即可。

    步骤在此强调一下:

    1. 登录界面,输入你的用户名
    2. 登录界面的黄色框中,会出现一串命令,把这串命令复制下来,用Windows CMD或者Linux/Mac 终端运行
    3. 运行结果整个复制黏贴到登录界面的白色框中,再点“用PGP签名登录”。
菜单
  1. libgen 图书馆革命
    libgen   天堂应该是图书馆的模样。一个阅读诗歌的人要比不读诗歌的人更难被战胜。创造是一种拯救。创造拯救了创造者本身。

    感谢科普,希望加密主义者越来越多。但是运行黄色框中的命令怎么运行?

  2. thphd   2047前站长

    @libgen #14611451 可以用Windows CMD运行,或者用Linux/Mac 的bash/zsh运行

    Windows运行效果如下:

    C:\Users\thphd>echo "2047login#thphd#2020-09-18T02:55:34.530Z" | gpg -u "thphd" --armor --clearsign
    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA384
    
    "2047login#thphd#2020-09-18T02:55:34.530Z"
    -----BEGIN PGP SIGNATURE-----
    
    iJUEARMJAB0WIQRFDqneMDVTxlUPND9PW4b908ng7AUCX2Qi5gAKCRBPW4b908ng
    7L23AX9UbxOdfupfN1bzq0kW08ftsGJd9TPpuhJDnZqZUrkEDzBqfaKnMrUwdhVL
    bLdFYwUBgOh3qXK9QIoomKchaHCPVmlL9Eyy9fbMLkrtV+z0T2qxhZ9QTUYjAoNE
    57ehiR/flw==
    =IHae
    -----END PGP SIGNATURE-----
    

    Ubuntu运行效果如下:

    thphd@ubuntu:~$ echo "2047login#thphd#2020-09-18T03:04:02.276Z" | gpg -u "thphd" --armor --clearsign
    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA384
    
    2047login#thphd#2020-09-18T03:04:02.276Z
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v2
    
    iH4EARMJAAYFAl9kI78ACgkQT1uG/dPJ4OwEggF+IwcK/qcObwn+W6lwfpfrW6WZ
    EzE0y4WgrLUsiS7iVNDmjxFm66q6yEF/n6bH3wnwAX9qlyX013pgukW5csAlJqj6
    gcobNghJCJlCqpD8NiiwQO18gVd9LuNzOW6iCQ6OanE=
    =DFcv
    -----END PGP SIGNATURE-----
    

    把从-----BEGIN PGP SIGNED MESSAGE-----开始,到-----END PGP SIGNATURE-----结束的所有内容,都黏贴到登陆界面那个文本框里面,就可以登陆了

  3. libgen 图书馆革命
    libgen   天堂应该是图书馆的模样。一个阅读诗歌的人要比不读诗歌的人更难被战胜。创造是一种拯救。创造拯救了创造者本身。
  4. thphd   2047前站长

    如果你的用户名含有中文,世界就不再以你为中心了。

    在Ubuntu上,如果遇到ioctl错误 (https://github.com/keybase/keybase-issues/issues/2798),请在运行上述命令前,先运行下面的命令:

    export GPG_TTY=$(tty)
    

    更新:Windows CMD编码问题已经通过换用Base64解决。

    在Windows CMD上,不会遇到任何错误,但是签名无法通过验证,相信是CMD造成的编码问题

    解决方法:打开记事本,放入下列内容:

    2047login#你的用户名#2020-09-18T04:54:05.786Z(你的登录时间,不应早于当前时间)
    

    保存为login.txt(编码建议选择UTF-8),然后去cmd,输入:

    gpg -u "你的用户名" --armor --clearsign login.txt
    

    这会在login.txt旁边生成一个login.txt.asc文件

    将这个文件用记事本打开,将内容复制出来用于登录即可。

  5. Resistance 技术宅
    Resistance   编程随想读者|会点IT技术|爱好信息安全|关注隐私保护

    俺有个疑问:GnuPG 列出的几个 ECC 算法,哪个更安全?目前最常用的是 ec25519。

  6. 20202047 Gosick
    20202047  

    嫌麻煩的可以用在綫生成pgp的網站。怕它上傳生成的密鑰可以生成的時候斷網,或者自己把代碼下下來本地打開。

  7. 琳不可瑤混 小朋友
    琳不可瑤混   你們可不能混瑤哦!

    瑤瑤花了好多時間才搞懂的,初學者確實要花點精力去研究。

  8. 白脸角鸮   加帕里公园原政府前总理,加帕里图书馆馆长

    @20202047 #14881218 类似于protonmail的安全邮箱可以自动生成pgp密钥,起的效果和你说的差不多,如果你想公开你的电子邮箱的话,就可以使用邮箱服务方自动生成的密钥。这类在线生成PGP密钥的原理大多都是基于OpenPGP.js技术开发的,它可以提供标准的PGP公钥与私钥,你可以下载私钥,导入至你PC当中的GPG里。
    在Linux下,部分发行版/桌面环境提供带有GUI前端的GPG客户端,比如说KDE项目中的KGpg,相比单纯的CLI界面能相对好操作点。

  9. toxinccp  

    据说量子计算技术是不是可以轻松暴力破解这类加密算法?现在ccp对量子计算研究很积极,目前用哪种算法最能抗量子计算机?

  10. libgen 图书馆革命
    libgen   天堂应该是图书馆的模样。一个阅读诗歌的人要比不读诗歌的人更难被战胜。创造是一种拯救。创造拯救了创造者本身。
  11. donleagles  

    无法成功登录,签名粘贴后显示:“500 Internal Error Exception/No username found in message”