摘要:上篇鏈接年,用更現(xiàn)代的方法使用上年,用更現(xiàn)代的方法使用中公鑰的發(fā)布與交換討論公鑰安全交換的中文文章比較少,而這一環(huán)是整個加密體系的重中之重。年月,有攻擊者惡意向公鑰服務器提交了對兩個著名網(wǎng)友的簽名背書。此事件中的受害者的證書就被簽名了次。
2021年,用更現(xiàn)代的方法使用PGP(上)
2021年,用更現(xiàn)代的方法使用PGP(中)
討論公鑰安全交換的中文文章比較少,而這一環(huán)是整個加密體系的重中之重。 大部分的PGP教程最后一步就是讓小白用戶將公鑰上傳,這是非常過時,且不負責任的,所以這里來詳細介紹下PGP 公鑰的 發(fā)布 與 交換。
首先明確一點: 上傳公鑰到 公鑰服務器 不是必要的,甚至是危險的。
如果你是新手,請不要發(fā)布你的公鑰到 公鑰服務器。
通過前文,你已經(jīng)熟悉了gpg的本地使用, 并且生成了自己的PGP 密鑰對。
想象一下, 如果你生活在1980年代, 想和遠方的朋友加密通信,需要先交換彼此的公鑰,又沒有一個統(tǒng)一的可信的認證機構(gòu),這時會有什么問題?
當面交換嗎?當然是個辦法,但是相信你不會想要將下列
這么長的公鑰抄寫到紙上,然后開車送到朋友那里,再讓朋友照著這個輸入他的電腦。如果中間有變動,需要重復以上過程n次。
那么還有其他辦法嗎?
那個時代還沒有l(wèi)ine、wechat這類即時通訊軟件,而郵件提供商默認是不可靠的,不然也不會有PGP的誕生。 并且彼時https還未出現(xiàn),用郵件交換PGP交換公鑰顯然不太安全。
你們雙方都需要便捷地交換公玥, 并且確認彼此得到的公鑰確實是未經(jīng)篡改過的,真實有效的,就成了一個難題,這樣,公鑰服務器也就呼之欲出了。
公鑰服務器使得人們只需要交換他們短短的key id 或者user id就可以方便地從公鑰服務器下載公鑰。
第一個KeyServer 叫做 HKP( web-ba
雖然服務器有了, 但開發(fā)者們擔心政府會試圖強迫鑰匙服務器運營商用政府選擇的各種證書來替換證書。
所以他們做出了一個決定:公鑰服務器永遠不會刪除信息。公鑰服務器可以為現(xiàn)有的證書添加信息(比如可以revoke/sign或者調(diào)整expire時間),但永遠永遠永遠不會刪除證書或證書的信息。
為了達到這個目標,他們開始運行一個分布式的國際公鑰服務器網(wǎng)絡,這就是現(xiàn)在的KeyServer。世界各地的公鑰服務器會定期相互通信,同步,比較目錄。如果政府強迫公鑰服務器運營商刪除或修改證書,那么在比較步驟中就會被發(fā)現(xiàn)。殘缺的公鑰服務器會用完好鑰匙服務器目錄中的內(nèi)容更新自己。
任何東西都不會被刪除,聽起來很美好,也是解決政府審查問題的一個簡單而有效的辦法,可是正是這個原則后來給KeyServer帶來了無窮無盡的問題。
好了,現(xiàn)在我們有了一個可以方便地上傳和下載公鑰的地方, 這樣是不是就萬事大吉了呢?
對于KeyServer 來說,任何人都可以上傳公鑰并聲稱自己是Linus 是Zuckerberg或是任何其他人,而KeyServer并不會去驗證你是否是你所聲稱的人(因為KeyServer本來就沒有一個中心化的運營者)。
如果你有一些密碼學的基礎(chǔ), 那么就會知道, PGP協(xié)議依靠的非對稱加密算法, 最脆弱的點就在于公鑰的交換這一步。公鑰交換時最容易收到中間人攻擊,你一定要確定你接收到的公鑰確實是你想交流的人的,由此TSL引入了CA證書認證體系,由一個可信的權(quán)威第三方來認證并頒發(fā)證書來解決身份的認證問題。 (具體可參見https系列沒那么淺地談談HTTP與HTTPS)。
“信任一個權(quán)威的第三方” 對于最初的極具有hack精神的開發(fā)者們來說, 顯然是無法接受的。
當然,你可以說下載公鑰后,通過電話等手段驗證下公鑰的指紋(fingerprint),就可以確認正確與否。 但是想象一下, 如果你在公鑰服務器找到一個聲稱自己Linus Torvalds 的人 你并沒有他的其他聯(lián)系方式,將永遠無法確定這個公鑰持有者到底是誰、這個公鑰可信與否 , 這樣無疑是低效的,并且使整個系統(tǒng)淪為了熟人之間的小網(wǎng)絡。
要知道,根據(jù)六度分隔理論(Six Degrees of Separation),世界上任何互不相識的兩人,平均通過六個人就可以產(chǎn)生聯(lián)系。 那么可以不可以這么思考, 假設我和小A見過面并檢查過他的公鑰,因而知道小A的公鑰的的確確屬于他本人,我選擇信任小A。而小A同樣驗證了小B的證書并為小B的證書簽名背書——小A的證書的持有人在此證明該證書是真實屬于小B。那么我無須見親見小B本人,也可以通過小A的背書而接受小B的證書。
如此循環(huán)下去,就形成了一張網(wǎng), 這就是信任網(wǎng)絡。
當今世界最大的Key Server 池, 符合它的標準的世界各地的公鑰服務器會定期相互通信,同步,比較目錄,數(shù)據(jù)完全開放下載。 現(xiàn)在一般說起KeyServer說的就是這個。
KeyServer雖然一直是PGP的重要基礎(chǔ)設置 但SKS Keyserver Pool 其實目前只有不到20臺服務器,GnuPG默認用的服務器是其中的 HKPS pool只有四臺服務器。
有一些KeyServer 沒有用SKS的軟件,運行的是更下現(xiàn)代和穩(wěn)定的軟件,比較有代表性的是 Ubuntu keyserver 基于Hockeypuck , 這些服務器仍然會和SKS pool保持同步。
這些服務器不與SKS pool同步數(shù)據(jù),由中心化的運營者運行, 會對公鑰上傳者做一定的認證, 并且支持刪除自己的公鑰。
比較有代表性的有, keys.openpgp.org ,Keyba
gpg --send-keys {keyid/uid}
gpg --recv-keys {keyid/uid}
此時有可能報錯
gpg: "xxxxxr" not a key ID: skipping
這時換個KeyServer就行:
gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys {keyid/uid}
驗證公鑰真實性 依靠多渠道確認的 公鑰指紋。
一般來說為別人的公鑰簽名后,需要發(fā)還給他,或者發(fā)到公鑰服務器(最好經(jīng)過本人同意)。
gpg --sign-key {keyid/uid} # 為已經(jīng)導入的 他人鑰簽名, 你為他簽名,意味著你將為他的身份真實性背書,請謹慎
因為并不推薦大家使用KeyServer,所以這里只列舉了基礎(chǔ)操作。
如果你決定使用KeyServer的話,可以參考 OpenPGP 最佳實踐 - 密鑰服務器設置你的客戶端與服務器通信使用 HKPS (HKP On SSL)協(xié)議, 并定期更新從服務器下載的公鑰。
在20世紀90年代初,開發(fā)者們懷著對技術(shù)的信心和人性的希望,期望創(chuàng)建一個友善 、純粹、沒有審查的凈土, 在當時背景下,KeyServer不能刪除任何已上傳的東西,聽起來是美好的,設計似乎是合理的。
但是事實是,網(wǎng)絡匿名環(huán)境中充滿了不那么友好的, 甚至是惡意的使用者,在當今看來 ,KeyServer這個系統(tǒng)并不健壯,問題重重,許多問題已經(jīng)被發(fā)現(xiàn)十多年,而且無望解決。
按照官方推薦, UID (User ID) 是用來存儲用戶信息的,應該在里面填上你的名字和郵箱,一個 GPG 帳號下可以有若干個 UID。
而其實這個UID是沒有任何強制限制的,也就是說你可以在UID中放入任何東西,可以是小說片段,可以是磁力鏈接可是以編碼后的圖像、音頻或視頻......
當上傳到KeyServer時 UID限制了2k的字符 . 以至于有人寫了個用KeyServer存文件的項目keyserver-fs)。
再次想象一下,你往網(wǎng)盤傳了一個文件,共享給其他人,全世界的人都可以往這個網(wǎng)盤文件中添加文件,而且永遠無法刪除,情況會變得有多糟糕。
見過一些生成 PGP“靚號”的工具,就是指定你喜歡的ID規(guī)則,工具會暴力生成PGP密鑰, 從中返回給你想要的密鑰。
由此很容易想到,若攻擊者知道了目標的KeyID, 完全可以通過工具來生成完全一樣的KeyID(這就是碰撞) 并上傳到KeyServer,來冒充目標。
而偽造一個KeyID有多容易呢,有研究人員借助scallion程序,使用了普通的GPU(Nvidia GeForce GTX)進行碰撞,花了4秒的時間就生成了一個指定的32 bit的 KeyID。
官方推薦公布自己的KeyID時,最少應該公布64 bit(也就是長16位16進制數(shù)啦 ),但是研究表明64 bit的KeyID也是可以 被碰撞的。
公鑰服務器任何人都可以上傳公鑰,甚至你可以上傳別人的公鑰,比如你可以將自己簽名過的別人的公鑰,再次上傳到KeyServer。
在WOT認證體系的設計中, 當客戶端收到一份未知證書時,它應當從公鑰服務器拉取所有為這張證書簽過名的人的證書,逐層上溯,看看是否能夠找到一張已經(jīng)被用戶信任的證書。如果能的話,就視信任這張為可信的。
2019年6月,有攻擊者惡意向公鑰服務器提交了對兩個著名網(wǎng)友的簽名背書。此事件中的受害者 Robert J. Hansen 的證書就被簽名了 15000 次。因而任何人的 GPG 在嘗試驗證他的證書時,都會拉取 15000 個簽名。而 GPG 在驗證這么多簽名的過程中會卡住很久。
由于被攻擊的兩個人在 GPG 社區(qū)中中地位很高,他們在 GPG 信任網(wǎng)絡中處于相當核心的位置。這意味著——當你驗證任意一份證書的時候,有不小的概率你會不小心拉取到他們倆的證書,然后你的 GPG 就會卡住。不但他們倆的證書沒法用了,他們倆簽名過的證書也都面臨危險,乃至于他們倆簽名過的證書所簽名的證書……
而上傳到KeyServer的所有東西都是不可刪除的...為了解決這個問題, GnuPG 2.2.17 LWN.net 開始, 從KeyServer下載公鑰時默認不再下載關(guān)聯(lián)的公鑰, 如果你想要感受證書DoS攻擊的話,可以在設置中開啟:
# ~/.gnupg/gpg.conf
keyserver-options no-self-sigs-onlyno-import-clean
有個很厲害的程序媛Yegor Timoshenko(前面的SKS文件存儲項目也是她的杰作),寫了個工具SKS-Exploit,可以將任何人的PGP公鑰損壞,變得不可導入。
這個工具同時還可以給任意人的公鑰 追加偽造的UID(不是KeyID),并騙過KeyServer。
另外能直接讓KeyServer宕機。
諷刺的是, 最初為了保護人們隱私而生的PGP 卻因為不能滿足保護隱私的法規(guī)GDPR ,而使一個公開的 SKS 公鑰服務器在歐洲處于違法狀態(tài)(GDPR規(guī)定: 服務商必須提供刪除個人信息的選項)。
許多新手按照教程提示的在創(chuàng)建PGP 密鑰的時候填上了自己的真實姓名,并按照那些教程將公鑰上傳到了KeyServer,在人肉社工猖獗的今天,簡直是個災難。
我試著在KeyServer搜過一些博客作者留下的PGP Key, 不乏有些比較注重自身隱私的,可是他們大部分都將自己真實的名字(漢字或拼音)和郵箱一起發(fā)到了服務器上,要知道那里的數(shù)據(jù)是公開且永遠不能刪除的。 也有些人意識到問題之后revoke了帶有真實姓名的公鑰,可是仍然可以查到,并且變得更加顯眼(revoke過的key會變紅)。
WKD 的工作過程是 ,通過郵箱客戶端 在域名服務器檢查一個"well known" 的URL, 如果匹配到了郵箱地址對應的公鑰,會使用https下載,并且不需要用戶進行其他操作。用戶不需要gpg 命令行等等復雜操作,讓PGP加密回歸單純的郵件加密本身,用起來有些像S/MIME但其實不一樣。
比如這樣一個URL: https://intevation.de/.well-known/openPGPkey/hu/g8td9rsyatrazsoiho37j9n3g5ypp34h
就對應 "aheinecke@intevation.de"這個郵箱地址。
這是通過Gpg4win的使用的一個示例,
](https://files.intevation.de/users/aheinecke/wkd-autoencrypt.gif)
這種方法不會泄露自己的郵箱,也不需要驗證指紋, 但是需要你的郵件服務商提供支持。
proton郵箱是原生支持 WKD的, 但是它使用的是自己私鑰,似乎沒辦法使用使用自己本地的公鑰,其他也有支持。
如果你有自己的郵箱服務器,并且想折騰的話,可以參照WKD Hosting。
如果是和熟識的朋友,你可以約在任何合適地方,用你喜歡的方式交換密鑰, 比如交換紙條,交換TF卡 或者usb設備,互相簽名認證,互相得到公鑰。
如果是想認識更多的人,并讓自己的公鑰被更多的人認證, 你可以參加「公鑰簽名派對(Key signing party)」。參與派對的人們相互交換公鑰的指紋(公鑰一般是存在服務器或是一個別人可以下載到的地方,這里只交換指紋),甚至需要相互出示身份證、護照、駕照、出身證明,以驗明正身。
有很多種方法將你的公鑰通過DNS服務發(fā)布,但是有些一些方法只適用于老版本的GnuPG,有些方法只適用與新版本的GnuPG,兼容性不佳,而且搞起來比較繁瑣,有興趣的可以自行查找資料。在這里并不推薦使用。
現(xiàn)在中文世界, PGP的使用者中 有很多都是 獨立的博客作者, 如果你擁有自己的博客或者個人網(wǎng)站,當然可以選擇將自己的公鑰發(fā)布在上面,最好給你的網(wǎng)站上一個Https 。
很多社交網(wǎng)站的個人展示頁,可以自由編輯你的信息,你可以將PGP的 公鑰發(fā)布在這里, 或者將 指紋 放在這, 這樣通過其他渠道下載到公鑰的人,也可以確認身份。
無論你是不是開發(fā)者, 都可以擁有一個Github賬號, 你可以開一個倉庫專門用來發(fā)布自己的公鑰,或者將公鑰發(fā)布到Gist。
Notion或者印象筆記等可以共享筆記的地方,都可以貼出你的公鑰。
使用分散的、多渠道的、可能是線下的方式來交換和確認公鑰 ,不要相信在放一處的 公鑰 和指紋。
去驗證緊跟在公鑰后面的指紋 , 就像你去問一個詐騙者,他是不是一個詐騙者一樣無用。
如果不是當面,請至少從兩個渠道進行驗證,比如你從一個渠道(比如這里)得到了我的公鑰 你想和我安全通信的話,導入前一定要從另一處(比如我公布的其他賬號的簡介)得到我的指紋, 驗證是否一致后再進行操作。
而且每次使用前,請重復以上步驟,確保你手上的公鑰是最新的。
[1]. 用 PGP 保護代碼完整性系列
[2]. GnuPG: 用多個sub keys保護primary key | missing idea (wordpress.com)
[3]. PGP 自我掃盲
[4]. GPG 的正確使用姿勢
[5]. 電子郵件加密指南
[6]. Short key IDs are bad news (with OpenPGP and GNU Privacy Guard)
[7]. gnupg密鑰簽署原理和過程 // Shells Home (shell909090.org)
[8]. PGP Key Server| Roll Your Own Network
[9]. Are SKS keyservers safe? Do we need them?
[10]. SKS Keyserver Network Under Attack
[11]. OpenPGP 最佳實踐 - 公鑰服務器
[12]. GPG SKS 同步網(wǎng)絡被投毒事件及其影響
[13]. where-to-upload-PGP-public-key-are-keyservers-still-surviving
[14]. GPG簡明介紹
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/126027.html
摘要:世界上有兩種密碼一種是防止你的小妹妹偷看你的文件另一種是防止當局閱讀你的文件應用密碼學上篇鏈接年,用更現(xiàn)代的方法使用上三安全使用和備份準備為了安全性,建議在一臺斷網(wǎng)的或者系統(tǒng)上生成你的密鑰對。世界上有兩種密碼:一種是防止你的小妹妹偷看你的文件;另一種是防止當局閱讀你的文件.? ...
摘要:作為一個老牌的反核能活躍分子,齊默曼為了讓所有有相似傾向的人們可以安全的使用并且安全存儲消息和文件而創(chuàng)造了加密。建議為不同環(huán)境,不同用途都單獨生成子密鑰,互不干擾。世界上有兩種密碼:一種是防止你的小妹妹偷看你的文件;另一種是防止當局閱讀你的文件.? ...
摘要:一密碼學的術(shù)語分類術(shù)語密碼體制明文空間密文空間密鑰空間加密算法和解密算法五部分構(gòu)成。柯克霍夫原則是現(xiàn)代密碼學設計的基本原則。特性散列函數(shù)特性消息的長度不受限制。 一、密碼學的術(shù)語、分類 1、術(shù)語 密碼體制:明文空間、密文空間、密鑰空間、加密算法和解密算法五部分構(gòu)成。 密碼協(xié)議:有時稱為安全協(xié)議,指以密碼學為基礎(chǔ)的消息交換的通信協(xié)議,目的是在網(wǎng)絡環(huán)境 中提供各種...
摘要:全球云計算廠商躬身入局,開啟現(xiàn)代化應用之旅事實上,包括亞馬遜云科技華為云在內(nèi)的全球云計算廠商已在這一領(lǐng)域進行了多年實踐。過去年,亞馬遜云科技一直在持續(xù)不斷地突破很多現(xiàn)代化應用技術(shù)。年,亞馬遜云科技發(fā)布第一個消息隊列的服務,至今已有年歷史。 2006年,是云計算滾滾浪潮的開端,這場IT技術(shù)變革始于亞馬遜AWS的成立,它讓公有云成為整個云行業(yè)的標桿,也形成了...
閱讀 3532·2023-04-25 20:09
閱讀 3736·2022-06-28 19:00
閱讀 3056·2022-06-28 19:00
閱讀 3075·2022-06-28 19:00
閱讀 3168·2022-06-28 19:00
閱讀 2874·2022-06-28 19:00
閱讀 3038·2022-06-28 19:00
閱讀 2632·2022-06-28 19:00