看到本論壇上時常有人問 gpg error 的問題,網路上的相關資源也大多是一兩行指令帶過,使很多新手即使問題解決了也仍然似懂非懂地,在此特地把我很久以前發表在摩托學員的文章轉過來這裡,希望對大家會有所幫助:
一、前言:
在 開放原始碼軟體的世界裡,任何人都可輕易取得軟體的原始程式碼並自行修改、編譯、散播,尤其是像 ubuntu 與 debian 這類可以經由幾個簡單的按鈕、指令驅動龐大而複雜的 apt 系統進行全作業系統的套件公升級、管理機制,安全性考量是乙個非常重要的課題,因為沒有人希望下載回來安裝的軟體,是被有心人士惡意篡改且穿插了惡意程式碼 片段在其中。因此,在 debian 和 ubuntu 的 apt 系統中,引進了所謂的非對稱式金鑰加密、解密法以及 md5 hash 演演算法機制來增加其安全性,以確保從網路下載回來的軟體套件是可信任的。
二、數字簽章簡介:
簡而言之,檔案發布者會有一組相對應 的金鑰(key),分別為公開金鑰(public key)以及私密金鑰(private key),公開金鑰顧名思義就是要公開散播給大家取得的,他是一大串體積大約 2k 左右的長碼,而私密金鑰則是只有檔案發布者才有的秘密鑰匙。發布者每當要發布時將原始檔案(明文,plain text)以私密金鑰加密演算後變成密文(cipher text)再行傳送,接收方則可使用發布者的公開金鑰對該檔案進行解密演算方可得原始明文。在這過程中,如果使用於加密的私密金鑰或者用來解密的公開金鑰 並非正確的話,接收端都無法正確的還原出原始檔案,因此可以達到資料來源可信任的目的。
然而,這個機制並非堅不可破,要從公開金鑰去反向推倒演算 出私密金鑰是可行的,只是其所需的運算量非常龐大,可能需要超級電腦才有辦法在幾年內破解出,普通的個人電腦要解出可能運算到電腦變成古董了都還沒破解出 來。因此,為了安全考量,通常金鑰組都會每過一段時間要淘汰掉重新產生一組新的來使用,這也是為什麼 apt 系統中時常都必須重新下載新的公開金鑰的緣故。
三、md5 簡介:
這是乙個單向的雜湊(hash)演演算法則,可以輸入任意長度的 資料,然後產生一串 128 位元的碼串,隨著輸入資料的內容、長度不同,所產生的碼串都會不一樣,而由所產生的碼串則非常難以還原回原始資料。因此只要原發布者將該檔案以 md5 演算過後產生的 128 位元碼串公布出來,接收端即可將收到的檔案先以 md5 演算後所產生的碼串來跟原發布者的碼串進行比對,若兩者相同則表示檔案內容確定為原發布者的檔案,兩者內容一致未被篡改。
四、apt 系統中的數字簽章機制:
由 於使用金鑰加密、解密時,其流程中的密文體積以及演算過程的時間會隨著明文的體積成正比成長,因此在 apt 系統中將整個軟體套件進行金鑰加密、解密則顯的太過不切實際。所以在 apt 系統中軟體套件或原始碼本身都是以明文的方式存放於伺服器上並提供所有的 apt 的 client 程式下載,套件維護者只會對軟體套件先進行 md5 演算產生 128 位元的碼串,再針對該碼串進行金鑰加密。
接收 端在進行套件清單更新時(apt-get update)會下載所有 deb 套件的 md5 碼串以及其加密後的密文,此時 apt client 則必須擁有該套件發布者的公開金鑰才有辦法正確的將接收到的密文還原成 md5 的碼串,還原出該碼串後即可跟下載回來的碼串進行比對以確定該 md5 碼串是可靠的,之後再對所有下載回來要安裝的軟體套件進行一次 md5 演算以產生乙個新的碼串,並將新碼串拿來跟可靠的 md5 碼串比對,藉以確認軟體套件本身是未被篡改的。
六、實際操作:
在 apt 中管理金鑰:
以 root 身份使用以下指令可察看目前系統中的 apt 所持有公開金鑰列表:
apt-key list
指令會產生很多行含有 ***xx/******xx 格式的資料,斜線前的那串碼是金鑰擁有者的 id,斜線之後的八碼是金鑰指紋的末八碼。
由於公開金鑰是要公布給大家任意取得的,因此一般而言都會有所謂的鑰匙伺服器(key server),上面專門存放大量的公開金鑰供取用,取用的方式就是指定該鑰匙的指紋(finger print),通常是該金鑰的最末 16 碼(或末八碼)。
當 系統在進行套件清單更新時出現了類似 no_pubkey ***************x 的錯誤訊息時,則表示有公開金鑰已過期或者是有新加入 apt 的 source 但未下載該對應之公開金鑰,而後面那串碼就是新的公開金鑰之指紋,只要使用以下指令即可從 key server 下載到該金鑰:
gpg --keyserver hkp://wwwkeys.eu.pgp.net --recv-keys ***************x
gpg 是一套專門管理金鑰的系統,但是他和 apt 的金鑰管理系統是獨立開來的,因此下載到金鑰後還必須將他匯給 apt 才行,指令如下:
gpg --armor --export ***************x | apt-key add -
之後在使用 apt 的金鑰列表指令應該就可看到新的公開金鑰了。
對 於不想要使用指令的人來說,在 synaptic 軟體裡也可以用滑鼠點點來完成這個任務,首先就是要把你要加入的金鑰檔案下載下來,通常是乙個 .gpg 為副檔名的的純文字檔,裡面就含有完整的公開金鑰。然後在 synaptic 裡的「設定」->「套件庫」->「認證」->「匯入金鑰檔案」把該金鑰檔匯進去之後,就大功告成嚕!
Windows的管理機制
windows的管理機制 一 核心態和使用者態 1.為了保證作業系統的穩定性和安全性,windows將處理器的執行模式分為核心態和使用者態。2.使用者的應用程式執行在使用者態,而作業系統的核心 和裝置驅動程式執行在核心態 3.處在使用者態的應用程式不能直接對作業系統的核心資料直接訪問,必要時只能通過...
Tomcat的Session管理機制
一 session使用原理 請求過程中的session操作 1 首先要解析請求中的sessionid資訊,然後將sessionid儲存到request的引數列表中。2 然後再從 request獲取session的時候,如果存在sessionid那麼就根據id從session池中獲取session,如...
Linux的記憶體管理機制
記憶體管理的一些基本概念 位址記憶體管理主要解決以下問題 程序的位址空間隔離 提高記憶體的使用效率 程式執行時重定位問題 現在的記憶體管理方法就是在程式和物理記憶體之間引入了虛擬記憶體這個概念。虛擬記憶體位於程式和物理記憶體之間,程式只能看到虛擬記憶體,再也不能直接訪問物理記憶體。每個程序都有自己的...