gpg加密命令 linux_加密方案 GNUPG amp; Yubikey
隨著時(shí)間流逝,我生活中出現(xiàn)的設(shè)備越來越多,密碼也越來越多,因?yàn)橛洃洺杀竞芏嗝艽a強(qiáng)度都不夠高,不安全,所以迫切需要一款密碼學(xué)加密工具來真正解放主動(dòng)記憶密碼,能夠?qū)⒚艽a存儲(chǔ)在一個(gè)文件中并且保證這個(gè)文件絕對安全。
基本概念
生成密鑰對命令 gpg --full-generate-key 按照提示即可,這里注意過程中是要輸入一個(gè)口令來保護(hù)你的私鑰,這個(gè)口令和加解密沒關(guān)系,而且后期也可以改,只是用來防止有人操作你電腦進(jìn)行解密, 所以這個(gè)口令可以為空。
生成好密鑰對之后gpg會(huì)默認(rèn)生成一對主密鑰對和一個(gè)子密鑰對,在使用時(shí)我們通常并不會(huì)糾結(jié)主,子關(guān)系,gpg也弱化了這一個(gè)概念,通常我們發(fā)布的公鑰指的是包含主公鑰和所有子公鑰的文件,這個(gè)文件是可變的,我們可以撤銷某個(gè)子公鑰,也可以添加某個(gè)子公鑰,然后重新發(fā)布公鑰文件。
同理如沒有特殊說明我們說的私鑰文件,指的是包含主私鑰和所有子私鑰的文件,這個(gè)私鑰和公鑰一樣也是可變的。
生成好的主密鑰對只提供認(rèn)證(Sign)和簽發(fā)子證書(Cert),自身沒有加密功能,主要作用是用來管理子證書: 生成和吊銷。
子證書用來加密
使用 gpg --list-keys 列出本地證書可以看到對應(yīng)的作用
~ $ gpg --list-keys /home/quanwei/.gnupg/pubring.kbx -------------------------------- pub rsa3072 2020-10-26 [SC] [expires: 2022-10-26]A5E7F2FE9590FE9B66BBC25B9D940B6C1ED930EF uid [ultimate] Alice <Alice@126.com> sub rsa3072 2020-10-26 [E] [expires: 2022-10-26]所有flag對應(yīng)含義如下
另外證書會(huì)設(shè)定一個(gè)過期時(shí)間,主要用來告知對方這個(gè)證書已經(jīng)不再用了,請不要用這個(gè)證書加密。過期時(shí)間是可以修改的,同一個(gè)證書隨意設(shè)定過期時(shí)間,即便證書超過了這個(gè)時(shí)間依然不影響實(shí)際的加解密工作,僅作為一種約定。
我們執(zhí)行 gpg -o pub.sec --armor --export userID是導(dǎo)出了所有公鑰信息。
我們從另外一臺(tái)計(jì)算機(jī)導(dǎo)入導(dǎo)入這個(gè)公鑰:
此時(shí)另外一臺(tái)電腦上顯示了我們導(dǎo)出的公鑰,而沒有私鑰信息。
我總結(jié)GNUPG主要有下面幾種場景:
郵件加密, 發(fā)送給某人/群發(fā)
這種場景是郵件時(shí)代端到端加密常見的一種,也是網(wǎng)上資料介紹最多的場景. 例如Alice想要發(fā)送郵件給Bob,那么需要做的事情如下
gpg -r Bob -o message.txt.gpg -e message.txt
這時(shí)候輸出的gpg文件是一個(gè)二進(jìn)制文件,只能作為附件發(fā)送,而不能通過普通的郵件文本imessage或者其他IM工具發(fā)送,為了能夠在普通的文本方式發(fā)送,可以輸出為文本格式
gpg -r Bob -o message.txt.gpg --armor -e message.txt
發(fā)送給某人之后,引出了另一個(gè)問題,就是如何證明這段文本是某一方發(fā)送的? 比如說Bob發(fā)送一個(gè) "借我500" 的信息給Alice, Alice收到之后如何知道這段信息是Bob發(fā)送的呢?此時(shí)需要Bob對這段信息進(jìn)行簽名.
Bob執(zhí)行(Sign + Encrypt)
echo 借我500 | gpg --sign -r Alice -o message.txt.gpg -e
生成message.txt.gpg,此時(shí)Alice進(jìn)行解密
gpg -d message.txt.gpg
輸出如下,此時(shí)就可以確認(rèn)這個(gè)信息來自Bob
~ $ gpg -d message.txt.gpg give me 500 gpg: Signature made Mon 26 Oct 2020 05:39:29 PM CST gpg: using RSA key CCBD7B73A6DCE6016699ABC479B0637CDD9A8C52 gpg: issuer "bob@126.com" gpg: Good signature from "Bobob <Bob@126.com>" [unknown] gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: CCBD 7B73 A6DC E601 6699 ABC4 79B0 637C DD9A 8C52 /c/Users/quanw/Desktop/gpg/linux $這時(shí)候都是對消息進(jìn)行加解密和簽名,如果需要對文件進(jìn)行加解密和簽名往往需要不同的操作。
附件加密,附件簽名,附件認(rèn)證
附件加密和消息一樣,這里的附件等同于文件,但是不同的是這個(gè)文件的接收方往往不是自己,是給別人加密的文件,或者驗(yàn)證來自別人的文件,給自己加密下面另說。
加密附件
gpg -r Bob -o data.zip.gpg -e data.zip
簽名附件和簽名消息不同,消息簽名時(shí)我將消息體和簽名文件放到了一起,并且同時(shí)執(zhí)行 sign 和 encrypt 的操作。對附件則不需要這么復(fù)雜,因?yàn)槲覀兺呀?jīng)有了一個(gè)文件想直接讓對方使用, 只需要生成一個(gè)文件指紋驗(yàn)證文件完整性即可。
gpg --detach-sign --armor data.zip
此時(shí)會(huì)生成同名的data.zip.sig文件包含了具體的指紋,生成形式如下
-----BEGIN PGP SIGNATURE-----iQIzBAABCAAdFiEEpXstWE238KYG4MS0ibIomUOvH+sFAl+WnPwACgkQibIomUOv H+u+QQ/+LBQVaDMLshRroPpPA/tKaDdhnNCxJiOwlwdhxWTy+ImwBy8wyJGgGEuo 4PstATnEK8RLQT8PqLq5svZKwcE6kCXOrF2/bSBpv99eix3hRdn9U7cayYG9ti0E GJ9lOXBC1s7lzkGdv4qEJBWcygYjsAa43d2GHCz8jOj5omdZ5Q2QwAWMgpDMXQ98 cv27xi/BViLRuLnLm9IUKxqy/DTU+lQwFS3AjBI0pi+ELrKSSsgikTLmobiHVl90 ZWYPtAI/C+ZQPFKQpu8wduhMiWS//Di2mkTG+TwYhAClo6yDf3IR4zrA/hxkLPWC p2IKAqNHCWijp625r+RztXVcfbwluBEQqepnpJlN4X0cboXsecG/fPLA8L3zhbWc b/GW/aewAxHeLsDQHGWcoodMZMWBdsQOPd/1/HDrjZA0faKeH147IbQ8lFb5HTu+ LafnuEa8Vgh4FY/rgCQDlkWuADDqkMw2eOXg/3dma2XkNjG2husvA8xLMq2zxyBM S6LW7QWNPj4toDihuVSj5Lj2MvGVrQDDs/Zs6Em34fqMSuCTuDUPOCfB+pja7ZxK ZEIDro9FAd4xg6nViEhLNQ/HbZRAAbBVNFIYJa9BlCYeTVnet9Lg4ijN57n4kRkk zm5hOAvccOCJMagdLdFqxXzQmTn0Hw3DWjajxKPrVuZYq2RMOig= =c7Oh -----END PGP SIGNATURE-----此時(shí)接受方收到文件簽名和文件指紋之后只需要
gpg --verify data.zip.sig data.zip
即可驗(yàn)證文件是否合法。
私人文件加解密
最終到了這里,最貼合我生活方式的一種,因?yàn)楹苌僬业搅硗庖粋€(gè)使用gpg的人,而且也沒有發(fā)布文件的場景,上面介紹的加解密都是兩人或多人之間進(jìn)行的動(dòng)作。同樣GNUPG也能做私人文件加密方案,例如使用pass命令管理本地密碼,或者私人文檔需要存網(wǎng)盤,為了不讓他人觸碰這些信息,需要加密。
對自己的文件進(jìn)行加密有一個(gè)要求,因?yàn)槲覀兛赡苄枰诓煌O(shè)備上進(jìn)行解密,所以如何保證自己的私鑰安全是顯而易見的問題。
Alice對自己的文件加密
gpg -r Alice -o data.doc.gpg -e data.doc
接收方是自己
解密時(shí)直接解密
gpg -d data.doc
這就是常用的操作,但是因?yàn)槲覀円缭O(shè)備使用,例如公司電腦上傳了一個(gè)文件,在家里需要能夠進(jìn)行解密,所以私鑰免不了要來回拷貝或者備份,這樣就增加了私鑰泄漏的風(fēng)險(xiǎn),設(shè)備越多, 風(fēng)險(xiǎn)越大。這里有個(gè)常識(shí)是我們加密解密都是用的subkey,所以如果想解密文件只需要攜帶這個(gè)subkey的私鑰即可。然后為了安全這個(gè)subkey可以一段時(shí)間更換一次,這樣如果私鑰泄漏也不至于所有文件都能被解密。
gpg -o alice-pub.key --export
這句導(dǎo)出了alice的公鑰文件alice-pub.key,里面包含了公鑰證書。公鑰文件是可變的,這句只是導(dǎo)出了目前所有的公鑰。
gpg -o alice-secret.key --export-secret-key
這里導(dǎo)出全部私鑰文件,包含master私鑰和subkey的私鑰,嚴(yán)格保存。
gpg -o alice-subkeys.key --export-secret-subkeys
這里導(dǎo)出了所有subkey的私鑰.
也就是除了公鑰其他的私鑰都要嚴(yán)格保密,在不同設(shè)備切換時(shí)只拷貝subkey的私鑰。一旦私鑰泄漏我們唯一能做的就是讓未來加密的文件不被解密,已經(jīng)加密的文件除非重新加密否則還是不安全的。
由此可得出主私鑰在其中扮演的角色是非常重要的,所以對于主私鑰的備份gpg也有一種方法,就是 gpg -o alice-secret.key --armor --export-secret-key使用ascii的形式導(dǎo)出私鑰,然后將私鑰打印到一張紙上進(jìn)行備份。
另外一點(diǎn)我們提到經(jīng)常需要攜帶的私鑰是subkey, 為了保護(hù)subkey,設(shè)計(jì)者們提出了smartcard的概念,smartcard是一個(gè)usb物理設(shè)備,這個(gè)設(shè)備提供一些特殊硬件設(shè)計(jì)保護(hù)私鑰不被外界讀取,同時(shí)又能用來解密文件。這樣的設(shè)備目前商業(yè)化的做的最好的就是yubikey產(chǎn)品系列了,用一個(gè)硬件設(shè)備保存私鑰即便攜又安全,個(gè)人比較推薦。
yubico.com將私鑰保存在yubikey很簡單.
插入yubikey之后, 使用gpg --card-status查看狀態(tài)
如果看到上面的信息說明yubikey已經(jīng)成功被識(shí)別了, 下面將 Alice 的相關(guān)私鑰導(dǎo)入到y(tǒng)ubikey中
> gpg --edit-key Alice > keytocard Really move the primary key? (y/N) y Please select where to store the key:(1) Signature key(3) Authentication key Your selection? 1...> keysec rsa2048/3C37786437E36A07created: 2020-10-26 expires: 2022-10-26 usage: SCtrust: ultimate validity: ultimate ssb rsa2048/FF7B5E819CE6C789created: 2020-10-26 expires: 2022-10-26 usage: E [ultimate] (1). Alice <Alice@126.com>> key 1sec rsa2048/3C37786437E36A07created: 2020-10-26 expires: 2022-10-26 usage: SCtrust: ultimate validity: ultimate ssb* rsa2048/FF7B5E819CE6C789created: 2020-10-26 expires: 2022-10-26 usage: E [ultimate] (1). Alice <Alice@126.com>> keytocardPlease select where to store the key:(2) Encryption key Your selection? 2...> q這里我們成功將簽名用的私鑰和解密用的私鑰導(dǎo)入進(jìn)去. 注意使用的命令是keytocard, 這個(gè)命令執(zhí)行之后對應(yīng)的私鑰文件會(huì)移動(dòng)到智能卡中,此時(shí)主機(jī)上的私鑰信息就不存在了,而是被一個(gè)智能卡的占位符取代,gpg知道此時(shí)這個(gè)私鑰存儲(chǔ)在智能卡上,下次解密時(shí)就會(huì)提示你插入智能卡。
導(dǎo)入成功之后退出,此時(shí) gpg --card-status可以看到已經(jīng)導(dǎo)入的key.
使用 pass 管理密碼
初始化好gpg之后,就可以用來管理密碼了, 以 debian 為例
安裝pass
> sudo apt install pass -y使用gpg角色初始化 store
> pass init Alice mkdir: created directory '/home/quanwei/.password-store/' Password store initialized for Alice新增密碼
> pass insert emacs-china Enter password for emacs-china: Retype password for emacs-china:顯示密碼
> pass show emacs-china github此時(shí)我們就可以將密碼文件夾 ~/.password-store 安全地使用網(wǎng)盤或者github進(jìn)行同步,只有我們能夠解密,或者借助yubikey隨時(shí)隨地解密。
結(jié)語
總而言之,只有密碼學(xué)意義上的加密才是真正的安全,雖然 GNUPG 用到的 RSA 安全性已經(jīng)受到質(zhì)疑,但在現(xiàn)在的時(shí)間點(diǎn)依然是保護(hù)個(gè)人安全最好用的工具之一。
總結(jié)
以上是生活随笔為你收集整理的gpg加密命令 linux_加密方案 GNUPG amp; Yubikey的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 数据存储怎么保存图片_文
- 下一篇: 我们注意到您的计算机目前处于离线状态_如