【安全上网】GPG入门教程

本篇是上篇「如何验证身份」的后续。上篇文章有不少留言提到,验证身份可以用GPG,GPG比起一次性的SHA-512哈希串要强大的多。只要你发布了自己的公钥,就可以无限次的验证身份。而且,GPG是非常强大的密码学软件,除了用来验证身份,它还可以加密自己的文件,或者在不安全的环境中发送加密消息。现在GPG软件已经有Windows下的图形界面,就算你不熟悉命令行,图形界面也很容易操作,如果你会用微信,就能学会GPG。我希望本文不止是一篇验证身份的教程。由于Windows非常普及,很多有能量对抗党国的人士未必会用Linux,而他们又十分需要加密技术,因此有必要写Windows下GPG的教程。

有几个名词会让人混淆:
PGP是一款商业软件,是这个加密软件的最初叫法。
OpenPGP是一种加密格式的交换标准。
GPG是GnuPG的缩写,是按照PGP实现的开源版本。以后只要记住GPG就可以了。
本文介绍的软件叫做GPG4Win,是GPG for Windows的缩写。GPG的前身PGP还有一段令人唏嘘的小插曲:

由于PGP的加密能力实在太强,PGP加密算法被美国政府认为是武器而禁止出口。PGP的作者Zimmermann把PGP的代码写成一本书,尽管武器——枪支、炸药和飞机的出口是受限的,然而书本受到宪法第一修正案(言论自由部分)的保护。最后美国第六巡回法庭和第九巡回法庭做出了同样的判决:软件源代码属于言论自由,受宪法第一修正案的保护。从此之后,美国政府再也不能限制软件源码流通了。



GPG for Windows的下载地址,下载前认准浏览器左上角的绿色锁头,防止钓鱼。
https://www.gpg4win.org/get-gpg4win.html

GPG的Windows前端叫Kleopatra,GPG本身只能以命令行操作,Kleopatra是为了方便操作GPG而包的一层图形外壳。在开始菜单里可以找到Kleopatra,打开Kleopatra之后如下

https://i.imgur.com/c6mcVUU.png
【fig1】


GPG看上去很复杂,但其实只有两个功能:

(1). 加密/解密文件
(2). 签名/验证文件

所有GPG能办到的事情都是这两条的延伸。如果你要给别人发加密邮件,就可以用GPG的加密功能。如果你有一两个文件需要加密,又不想用VeraCrypt这样的重量级工具,也不妨试试GPG的加密功能。如果你和别人做生意合伙记账,又不希望账本被篡改或者被抵赖,就需要GPG的签名功能。

VeraCrypt和WinRAR的加密算法叫做【对称加密】,因为它加密和解密需要相同的密钥(姑且理解成密码)。对称加密的缺点是无法安全的分发密钥,任何知道密钥的人都可以解密你的信息。因此VeraCrypt只能加密自己的电脑,没法用对称加密算法去和其他人安全通信。GPG最大的特点是【非对称加密】,关于非对称加密,请背会这句话

公钥加密,私钥解密


非对称加密加密和解密用不同的密钥。我可以自己保留解密密钥,称为【私钥】。然后我再把加密密钥公开,称为【公钥】。任何人都可以用公钥加密消息,再把加密消息发给我。但是只有我自己的私钥才能解密消息。因此可以用GPG在不安全的环境中通信。

这里再以WinRAR为例说明非对称加密的工作方式:如果WinRAR有非对称加密功能,那么用它加密文件需要两个密码:一个压缩密码,和一个解压密码。你可以把压缩密码发布到网上,任何人都可以用压缩密码给你发加密压缩包。但只有你自己的解压密码才能解压这些压缩包。这里压缩密码就是公钥,解压密码就是私钥,压缩密码和解压密码合在一起叫做【密钥对】。

什么叫【不安全的环境】?举一个例子说明GPG的用法。


1. 创建自己的密钥对


假设我打算在品葱上成立一个地下组织,密谋颠覆大清朝廷。现在有一段文字需要通知各位地下党成员:

十月十六日夜八時于武昌長沙點火為號舉事



品葱上时刻有大清网警在监视,显然我不能发贴通知这段消息。用私信也不安全,如果品葱服务器被安插了后门,这条明文消息就会被清政府知道,到时候就人头落地了。那么能不能用WinRAR加密以后再发送消息呢?当然也不行。WinRAR加密和解密需要【相同】的密码,如果用私信发送WinRAR密码,那么密码仍然会被清政府截获并拿来解密消息。因此品葱是【不安全的环境】,对称加密无法在这种环境下通信。

GPG可以在不安全环境下通信。首先,用GPG创建一个密钥对(就是一把公钥和一把私钥),私钥必须保密,GPG会把它加密保存在你的电脑上,但是公钥可以公开。然后你就可以用贴子把公钥发布到品葱上,或者糊网警脸上。别人可以用你的公钥加密消息,再把消息发给你,然后你可以用自己的私钥解密信息。反过来,要给别人群发秘密消息,就要导入他们的公钥,用他们的公钥加密消息再发给他们

你的解密密钥(私钥)是不公开的,发布到网上的只有加密密钥(公钥),所以即使网警拿到了发给你的的加密消息和公开的加密密钥,也无法解密你的消息。只有你自己私有的解密密钥才能解密。同理,如果你用别人的加密密钥给别人发消息,由于你自己没有解密密钥,自己发送的消息甚至自己也不能解密!当然没有解密密钥的网警也不能解密。只有拥有私钥的收件人才能解密。

请记住:加密密钥就是公钥,解密密钥就是私钥。以下将统称为【公钥】和【私钥】。

下面讲创建密钥对的具体步骤。首先点击GPG页面上的【新建密钥对】,选择【创建个人OpenPGP密钥对】会弹出这个向导,如下图

https://i.imgur.com/lhthQEe.png
【fig2】


这里名字和电邮都不是必填项,唯一能区分密钥对的是【密钥ID】。你可以只填品葱网名以防泄露个人隐私。然后点开旁边的【高级设置】,如下图

https://i.imgur.com/4WLJKhm.png
【fig3】


私钥在非对称加密中非常重要,一旦私钥被人拿到,别人就可以伪造你的身份,或者解密你的信息。如果你确定自己可以保管好私钥,就取消勾选【有效期结束于】框。RSA密钥选4096bit。

目前所有的非对称加密算法都有可能被量子计算机解密,如果RSA密钥长度是N,那么量子计算机就需要2N个逻辑量子位才能解密RSA,解密4096bit的RSA密钥需要8192个逻辑量子位的计算机,现在量子计算机最多不过十几个logical qbit,离8192还差几百倍,在大清灭亡前不用担心非对称加密的安全性。

开始创建密钥时GPG会要求你输入Passphase来保护私钥(很好的功能!),Passphase和password基本一样,但是Passphase里面可以使用空格,安全性比password好。以后所有涉及到私钥的操作都需要输入Passphase。创建好密钥对之后的GPG如下图。这里【指纹】和上篇中的SHA-512字符串是一个东西,用来保证公钥没有被篡改。如果别人伪造了一个公钥,那么这个公钥指纹就会发生变化。

如果你不知道什么叫【吊销证书】,就不要把公钥上传到【公钥服务器】,不过公钥贴到品葱是安全的。这里直接点击【完成】就可以。
https://i.imgur.com/PHkX6On.png

【fig4】


GPG主界面上会列出你拥有的密钥,自己的【密钥对】以加粗黑体显示,导入的别人的公钥以正常字体显示。GPG主界面如下图。

https://i.imgur.com/TvR7R0X.png
【fig5】


在密钥上右击,选择【导出】,就可以导出密钥对里的公钥。选择【导出绝密密钥】可以导出密钥对里的私钥。私钥绝对不能透露给别人,也不要明文保存私钥

公钥和私钥的默认导出格式都是asc文件,asc文件是纯文本,可以用记事本查看。这里以纯文本导出SONG JIAOREN的公钥(public key):

-----BEGIN PGP PUBLIC KEY BLOCK-----

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
GFvdRWiC
=wMTG
-----END PGP PUBLIC KEY BLOCK-----



对应的公钥指纹是

F61C3E4DE34361CB5EBBFC1363DE925DDCC9D3AE



可以把公钥贴到任何地方,无需担心泄密。

这一节的末尾的注意事项:
GPG公钥私钥都可以导出成文本文件(asc文件),私钥需要备份,但绝对不要导出成文本。GPG提供了一种加密格式.gpg来保存私钥。


2. 导入别人的公钥(Public key)


要验证别人的身份,或者给别人发加密消息,就要导入别人的公钥。比如现在有一个人叫JIANG YIWU,他在网上发布了自己的公钥和公钥指纹:

-----BEGIN PGP PUBLIC KEY BLOCK-----

mQENBF4MeaIBCAC6KOX6SbB4/82G9IUQB3dkabLMyh8cuPIaAjXZdKu8f+xInS8B
H8iPTcFYym4VD2I3xqhAc9a91ZzvoO/hYRmn0QvFDPMM94Gee9H3+pYVa9VZIEPJ
tWh/DTJrhlyRgBoxrQenPdE+zTwKMrjKx9I7dnPEFeuaQekOZhLPUjO76kXXtw8l
UgWHHkQU+Ve6pvuDSrJdN3KOwk51M1wywcmlABoB3ETOwTm7bMhkdX7kLPiJ399p
DpH99FBsMcuMJ0Iq5XAoGVtzMsSv/REzcLDJIdPziuZsLb5oOhXLotMufgCAsXOq
uYbpFqoEWonnKZMs1wbLMHNGgBc8kNIpUnozABEBAAG0JkpJQU5HIFlJV1UgPGpp
YW5neWl3dUB0b25nbWVuZ2h1aS5vcmc+iQFUBBMBCAA+FiEEZdGwgapXznrIb+GY
dyyfEFMHBXUFAl4MeaICGwMFCQPDWB4FCwkIBwIGFQoJCAsCBBYCAwECHgECF4AA
CgkQdyyfEFMHBXWoEgf9GG1klAWOr/pRSCuHA4XNfS4c1gbG5tV0BnB4pGxowjBc
+ymKgtUwc4FqAS006fph3sYBKQtHBotnv4aKRanh7mXpjBOh6JZGRO97MBiJvzWM
BodWfjEopNVUkz5gDpx1gnpAKOF11Yn9nJmku+OmeXZy8ZV2y9kzSUGDUDfK89pG
oVlbojQS12aHC8DUU/vz73zg5Zx7/YndnanHPGZiAP57iUfJRgT9PIoM2i619f6O
JiA6uDAqGzRQkqmdq76i0u1zr8DMUZiN7yr7FGTwT2lZXvbEmdyAgn0egQKGcLAp
C2IhrjnJj0z9BEFe0HW5+jbK4hp/xtVLqlAdl+pT67kBDQReDHmiAQgA1zGp7px9
KBfY4HR2Yc1Z1XX+CDO9J+sgNdTiBGdiX836Gq4D2mJGL8kXyCtFpG9DUW/wwAC9
5nKCZHF091IgEtVNPcY+nWK3Ce+8H6axJSPiG0cCsgEKEjzO10NTbr5UcbUciUvr
nSXaIRAk6wJJcUv5AZCdaucTxIUGgej/43mrnt4s0DPq9b4IGUjNaayxwyhhOVED
+Kc+/5h7TVuQpqy78F9DprvZS3MwEOfRLm3wd5WyCq5g5dsGY36zcnRkBBliYMX4
ofDe/GlWRZmXtIJB1iWDJr6BEBpddSCjq9q+wkOnXIDnHi+kM02Uf9Xtam2uR9ws
l5kS9nF3GBrmfwARAQABiQE8BBgBCAAmFiEEZdGwgapXznrIb+GYdyyfEFMHBXUF
Al4MeaICGwwFCQPDWB4ACgkQdyyfEFMHBXV2iAgAtV+jIQ3kL+i/DTgDq/7LRH+C
D1Sk1xLWA7PkoYRtqYmdgubzSv+FY0Z3f61nCBdxwQXaXISi/+V49wNX44F/zovf
beLJ6lrAU67vGHM4uyFWbEA1ric9/w7yLvv5L4YoE8kBOYqsvG1ZFTjxkshH8DSz
TBoXeJ1C+d4AcOOjh50DwPTQEk63n+tAVESzG2To86wlVEzTcDukhfNAEV+750jv
iCcGchhuIwCBiqUZCrWct+qDqvs7dZ+QZ5WMAE7B3hWLg8ktzPIwKVc/lGqy0hMe
xrngX7TQij+/RTGNUx29K1Zj0nu6Cu7O7QieJBSFmB7c7P0IPnTCB6dhNwvHeQ==
=6Zf2
-----END PGP PUBLIC KEY BLOCK-----



指纹:

65D1B081AA57CE7AC86FE198772C9F1053070575



把上面“-----BEGIN PGP PUBLIC KEY BLOCK-----”和“-----END PGP PUBLIC KEY BLOCK-----”这两行和这两行之间的全部内容复制到记事本里,然后保存类型选择【所有文件】,文件名叫JIANGYIWU.asc

然后在GPG的主界面上,点击【导入】,导入公钥文件。这时会弹出一个框问你是否信任这个公钥,点击【是】,就会出来认证证书的窗口。如下图。

https://i.imgur.com/rlKZwwc.png
【fig6】


最上面的【Fingerprint】就是这份公钥的指纹。这时需要核对JIANG YIWU之前公布的公钥指纹和这里GPG计算出的指纹,如果两者一致,就可以信任这个公钥。点击【认证】即可。


3. 加密和签名

注意这里的标题是【加密和签名】。GPG里面加密和签名可以一步完成,十分简单。这里以加密文本消息为例,点击界面上的【记事本】,输入要加密的文字:

十月十六日夜八時于武昌長沙點火為號舉事



https://i.imgur.com/jo9OYn6.png
【fig7】


点开旁边的【收件人】,选择签名身份,这里我们以SONG JIAOREN的身份向JIANG YIWU发送加密消息,如图,【签名身份】是你自己的身份,【为他人加密】是你的收件人的身份,这里可以填多个收件人。当然,你需要先导入这些收件人的公钥,才能向他们发加密消息

这里很有意思的选项是【为我加密】,如果不勾选这一项,你就没法查看自己加密的消息了,这就是非对称加密的特点。当然这个选项在某些情况下很有用,如果你被清政府抓住,衙役也没法解密你发送的消息。

https://i.imgur.com/JhBT3Ry.png
【fig8】



加密完成的消息长这样,可以安全地私信别人

-----BEGIN PGP MESSAGE-----

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
KV5Qt7nvTO9q1n+C
=xkfT
-----END PGP MESSAGE-----



如何签名:

如果【为自己加密】和【为别人加密】这两项都不勾选,就可以对一段文字签名,防止消息被篡改。签名不需要导入别人的公钥。但是需要发布自己的公钥,否则别人无法验证。

上面文字以SONG JIAOREN的签名是

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

十月十六日夜八時于武昌長沙點火為號舉事
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCAAdFiEE9hw+TeNDYcteu/wTY96SXdzJ064FAl4MhLEACgkQY96SXdzJ
066fEA/+IWYpNt4Jjmkm38IC1Svr6PZgR5Sl4N8fjot+bduQ1XDx5ZdUscA+VC60
E8JS7N706ofe5EW2z5Xz6jqZNVwJViIO3JLvfeENB3PEmQLCSVX1r+8fP0yzFodu
lJNojAhd2hR5JvJVd7D63g8tOEmxCb3lvGFS8E3gkCvI+CrpE235MDRyf0Xei9+4
Q1wXrEGHpHpQN4okaKLZBVypvbacuFn7rrCLLc2f8USCDOGyj/dlondBDxbi8dzN
UV4OzFoZCK9aZrhKotCNlPpugMo5mmfw7e/YIkh1x93ADI/OCjB0vK+ZlPIh3asF
Pys3ld2ATsFocoXgFw5O+gAL/XNRIHmsL04XHDFNRiJh6L+cCY9sfsw00yFFiZmF
rGncxrgZijXGP0rFSNMzz17stce0jKo73NLD1S/PP8RMgMCdAMVNx6HHTM5hpzAG
obuYeXr+yoZ+PZc2RheKGtKYjtHL6XIKhDp2Fv1eaA56+DQZaVGtpBtrohLbjtwL
UgPojX1eq3TG5/YCLn9EPr3YBTP+ZABbuTxRxwyjk7nOp7+7HsJYUoB6p2ABqeuj
CqyRZZg2ie+UnkQauIIG2Mc1pbPIhpwm2/99MpvWY215jxqiK7dDMOrMuUdp/lI4
zMUZYZ7UtCBNSZs3GF9/kdOxeLGADWUCMTC/wZZz4reK6Fccgp0=
=r/f7
-----END PGP SIGNATURE-----



这段消息在签名以后,别人就无法篡改它。在下面的【验签】一段可以看到,即使上面的消息被改动一个字,验签的时候GPG就会提示验证失败。如果用GPG的这个功能来记账,就可以防止账本被篡改,这就是【数字签名】

GPG还可以加密文件和文件夹,可以作为VeraCrypt和WinRAR的轻量级替代。具体方法和加密文本差不多,这里就不多说了。

注意:如果你的私钥文件丢失,那就无法解密文件。就算记得Passphrase也没用!可以用.gpg格式导出私钥,.gpg格式是加密的,只有你的Passphrase可以解开。然后把加密的gpg文件备份到其它地方。

3. 解密和验签

非对称加密的规则是【公钥加密,私钥解密】(为了加深理解,各位可以想想如果反过来会发生什么),因此发给你的加密消息一定用了你之前发布的公钥,你需要用自己的私钥解密。

假设现在的身份是JIANG YIWU,因此有JIANG YIWU的私钥。把上面的加密消息复制到GPG的【记事本】里面,点击【解密/验证记事本内容】,就可以看到加密消息。

现在解密上面那一段加密消息,如下图

https://i.imgur.com/D78noQ3.png
【fig9】


解密完成

https://i.imgur.com/EpZokXf.png
【fig10】



如何检验签名:

签名的规则是【私钥加签,公钥验签】(想想反过来会发生什么),你需要先导入别人的公钥,才能验证这个人的签名。

假如你已经导入了SONG JIAOREN的公钥,就可以检验这段话的真实性。把这段文字从“-----BEGIN PGP SIGNED MESSAGE-----”开始,复制到“-----END PGP SIGNATURE-----”这一行(包括开头和结尾的两行),再粘贴到GPG记事本里,点击【解密/验证记事本内容】,如果内容没有被篡改。GPG就和上图一样显示一个绿色的框,提示这是有效的签名,并且显示签署人和签署日期。

如果你下载了GPG,就可以导入SONG JIAOREN的公钥,你可以试着改动一下SONG JIAOREN发出的文字,并验证一下上面的消息。任何对这段文字的改动都会导致GPG验证失败。


================



4. 身份验证


身份验证是GPG签名的附带作用,比SHA-512要复杂一些,步骤是:

(1) 我用大号在某个贴子里发布自己的GPG公钥:

-----BEGIN PGP PUBLIC KEY BLOCK-----

QN4okaKLZBVypvbacuFn7rrCLLc2f8USCDOGyj/dlondBDxbi8dzN
UV4OzFoZCK9aZrhKotCNlP.......(太长省略)
-----END PGP PUBLIC KEY BLOCK-----



(2) 我因为潜在的安全风险暂时退葱,主号临时封禁。

(3) 确保安全后,用小号注册。按照【加密和签名】这一节的方法,【签名】并发布一段话

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

我胡汉三又回来啦!
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCAAIHmsL04XHDFNRiJh6L+cCY9sfsw00yFFiZmF
rGncxrgZijXz17stce0jKo73NLD1.......(太长省略)
-----END PGP SIGNATURE-----



(4) 其他人用【导入别人的公钥】这一段的方法导入用户之前发布的公钥,再用【解密和验签】这一段的方法验证。如果签名没有问题就说明是本人。

这种方法也可以在网络的其它地方证明身份。


5. 总结


(1). 给别人发消息:导入别人的公钥 -> 用公钥加密消息 -> 发送消息

(2). 接收别人的消息:创建密钥对 -> 发布自己的公钥 -> 别人用这个公钥发来消息 -> 你用自己的私钥解密消息

(3). 给消息签名:创建密钥对 -> 发布自己的公钥 -> 用自己的私钥给消息签名 -> 把消息和它的签名一起发布

(4). 验证别人的签名:导入别人的公钥 -> 接收消息和它的签名 -> 用公钥验证消息

=============



从上面可以看出GPG的玩法非常多。GPG进一步的用法还有:吊销证书、管理密钥、使用【主密钥】保护私钥安全。如果有发加密邮件的需求,网上还有很多结合GPG和ThunderBird发加密邮件的教程,如果会用GPG的基本操作,这些应该不难。

作为练习,可以在GPG4win的网站上验证一下刚才下载的gpg4win安装包。

a. 首先导入GPG官方的公钥:https://www.gpg4win.org/package-integrity.html
从网页往下找,找到 Intevation File Distribution Key 这个链接,点击下载ASC文件,这就是公钥,把它导入GPG。

b. 接下来GPG会要求你确认公钥指纹:Intevation File Distribution Key链接后面会写着Fingerprint:XXXXX,核对指纹无误后点击【导入】。

c. 在GPG的下载链接上 https://www.gpg4win.org/download.html 找到OpenPGP signature这个下载链接,下载.sig签名文件

d. 把.sig文件和下载的安装包放在同一个文件夹,点击【解密/校验】,选择.sig文件,就可以校验安装包。



最后说一下国产证书的危险性。在验证公钥时,有时会遇到连公钥指纹都不可信的情况。一种解决方法是,用SHA-512给公钥算一个哈希值,再找一个大家都信任的人,比如用@Admin的私钥加密这个哈希值,并把加密后的Hash附在公钥文件的末尾,这就是【数字证书】。如果Admin不可信,那么用他的私钥加密的所有公钥文件都将不可信。过去12306强推CNNIC证书,就是党国在试图当这里的Admin,控制网络中所有的加密信息,关于CNNIC证书的危害可以看编程随想的博文《CNNIC干过的那些破事儿》。

这几年国产证书有卷土重来的趋势,见这个《国产证书的再次崛起:GDCA成功进入Mozilla根证书库》。由于tor浏览器本身基于firefox,如果firefox内置国产证书,那么用tor上网也不安全。一定要手动拉黑tor浏览器内置的国产证书。
40
分享 2020-01-01

26 个评论

手机也是一样的功能吗?
技術貼子一定要強推,已推薦

手机也是一样的功能吗?


安卓手机上好像没有gpg,基本就是筛子

安卓手机上好像没有gpg,基本就是筛子


那这普及面不广,仅限于有电脑的群体

那这普及面不广,仅限于有电脑的群体


安卓系统非常不安全。如果信息十分重要,即使gpg有安卓版也不能用。
有需要的話,建議弄一個跟 CDEncrypt 類似的網頁版本工具,全平台都可以免安裝使用。
和 CDEncrypt 一樣使用瀏覽器自帶的 RSA 加密和簽名功能即可(SubtleCrypto API),甚至可以考慮提交到 CDEncrypt 項目。
发干货了,这事ao的,,,
虽然我币圈人对GPG有所了解,但写GPG教程实在是太麻烦了,就一直懒得写,你帮我写了,我表示感谢,,,

安卓系统非常不安全。如果信息十分重要,即使gpg有安卓版也不能用。



这种说法不太同意了,安卓好歹是Linux内核。依旧遵循使用者越多越容易发现漏洞的原则在发展,国产手机又是去谷歌框架的定制化安卓。安全和便利终将有个博弈平衡点去做工程实现,无限制抬杠只会在争吵中迷失自我。

安卓系统非常不安全。如果信息十分重要,即使gpg有安卓版也不能用。


用【开源】的 Custom ROM,不安装国产 App,还是比较安全滴。

安卓手机上好像没有gpg,基本就是筛子


Android 有 gpg,Termux 里面可以安装。
有一些 App 可以方便地使用 GPG,俺用的是 OpenKeychain 这就 App。

另,
命令行的 gpg 建议用

gpg --full-gen-key --expert

然后选择 ECC 提高安全性。
谢谢作者分享。
虽然看的很吃力,但还算搞明白了。等下就去推广。
admin 公共账号
感谢详细的讲解,我觉得这个知识对品葱非常有用,我暂时置顶了。(by Alleria 好奇试一下"以admin发表")
关于安卓,大家可以参照tor project的这篇博文:
https://blog.torproject.org/mission-impossible-hardening-android-security-and-privacy

个人总结:
不只是安卓,移动设备(mobile devices)本身就是不安全的,你在墙内,就不应该用手机冲塔。
技术贴,自己暂时用不上但是也要支持一下。

谢谢作者分享。虽然看的很吃力,但还算搞明白了。等下就去推广。


感谢反馈,我感觉文字标记有些滥用,重新修改了一下。

关于安卓,大家可以参照tor project的这篇博文:https://blog.torprojec...



我也看了,有看懂代码和数学公式的能力,找一台不明显的手机自己动手削减代码库。一样能实现高度的安全性,你的总结报告不够深度。

我也看了,有看懂代码和数学公式的能力,找一台不明显的手机自己动手削减代码库。一样能实现高度的安全性,...



唔,怎么港,有时间有精力有能力当然可以自补漏洞,甚至自己造手机都行,但是窝萌还是要讲究成本和收益的。
这种操作过于复杂,而且安全性终究还是没有什么保障。
对于一般路过网民,学习一下共产党,一刀切才是最好的。
而且还能减少自己丸手机的时间,一举多得。
GPG是很好的工具。

要注意将自己的私钥要妥善保存,最好将后缀改为.dll之类的系统常见文件后缀。

如果能有一台专门的机器或者专门的虚拟机装GPG最好。

私钥备份不光要加密保存,还要注意混淆,如果能隐写在图片或者其他文件中最佳。

我也看了,有看懂代码和数学公式的能力,找一台不明显的手机自己动手削减代码库。一样能实现高度的安全性,...


这个“高度的安全性”有多高?
手机的风险包括:有一堆传感器、无法像电脑那样搞【操作系统虚拟机】隔离、“全盘加密”也不是那么靠谱、固件(firmware)不开源。

这个“高度的安全性”有多高?手机的缺点包括:有一堆传感器,无法像电脑那样搞【操作系统虚拟机】隔离,“...



找个手机维修店让老板挑断主板上不希望用到的传感器,全盘加密有点牛刀杀鸡了。

还记得有个叫:USB杀手,用电容器储能一次性击穿主板上各种芯片。比软件上玩花招直接多了,伪装成充电宝好了!相信自己有插一下搞破坏的时间,电器工程师一抓一大把可以帮忙实现。
非常详细实用的帖子,学习,这才是有营养的帖子。
爲什麼我在Firefox和Google裏都能找到這張證書
GDCA TrustAUTH R5 ROOT
其实手机上也有gpg类似的软件,叫OpenKeychain,官网在此
不过似乎只能在安卓上面用,ios系统暂未找到合适的软件(不过也还是有,就是有点粗制滥造或者要花钱。appstore搜pgp就行了)。
   这个软件最大的特点就是它做了很多简化,使得它比电脑上的GPG简单得多。它省略了那些复杂的概念比如非对称加密,公钥私钥等。入门门槛较低,适合墙内反贼在不翻墙的情况下互换信息(个人推荐把密文保存为dll文件,再去掉开头和末尾两行,对方只需用文本方式打开dll文件并加上开头末尾)。
  还有,这是开源软件,支持中文,没有广告,不过作者在上面开了个小商店卖东西,软件层面上的安全性还行吧。
   基础用法就是创建密钥后选择“我的密钥”里面的你刚创建的密钥,点击分享按钮,就能把密钥(这里相当于公钥)分享给好友了。好友只需复制密钥(公钥),打开软件就能看到导入密钥(公钥)的提示了。

  不过手机本来就不是很安全,这种东西拿来玩玩就好,搞革命还是算了。
支持信息安全技术科普贴
感觉有点复杂,现在暂时用不上,以后有用再回来看。
未詳細看,但是關於 PGP/GnuPG 的公匙伺服器一定要說一說一個幾個月前的「漏洞」(特色?):GithubHackerNews

大概是這樣的:由於 PGP 的 SKS 公匙伺服器是 Write-Only ,無法刪除的(單是這方面大家都要三思要不要將自己的公匙放上伺服器),任何一個路人甲都可以隨便上載自己對受害君的公匙所簽發的信賴證書,喜歡的話甚至可以上載成千上萬條證書也可以 (Certificate Spamming)。理論上這些所謂信賴是沒用(我不認識路人甲,他信任受害君關我屁事?)但亦沒害(本身就沒對路人甲有所信賴,不會有因為他信錯賊人公匙弄得我跟著一起信錯人的狀況)

但實際操作是,當你要導入某人的公匙時,所有信賴該人的證書都會一拼導入來評估該公匙的可信任度。Linux 上的 GnuPG 就會因為有太多證書 (~150,000) 要處理而當掉,效果跟Denial of Service 差不多。其他 OpenPGP 的 Implementation 好像都會出狀況,不過不像 GnuPG 那麼嚴重。

我提這個「漏洞」出來是為了提醒大家要小心選擇 PGP 公匙伺服(一定不要再用 SKS )。如果可以的話,幹脆將自己的公匙轉成 ASCII Armor 文字版本,轉成 QR Code (不過 RSA 4096 太大,放不下 QR-Code,用橢圓曲線的加密法吧,小很多),之後再線下交易吧

要回复文章请先登录注册

要回复文章请先登录注册

发起人

中客理真迫