世界上有兩種密碼:一種是防止你的小妹妹偷看你的文件;另一種是防止當局閱讀你的文件. > > ? —— Bruce Schneier《應用密碼學》 ## ----PGP基礎 ## 一、PGP簡介 ### 是什么? PGP 全稱是 Pretty Good Privacy,是一個被設計用來加密信息,保護隱私的**軟件**。現(xiàn)在提到“PGP”, 基本上是說" />
摘要:作為一個老牌的反核能活躍分子,齊默曼為了讓所有有相似傾向的人們可以安全的使用并且安全存儲消息和文件而創(chuàng)造了加密。建議為不同環(huán)境,不同用途都多帶帶生成子密鑰,互不干擾。
世界上有兩種密碼:一種是防止你的小妹妹偷看你的文件;另一種是防止當局閱讀你的文件.? —— Bruce Schneier《應用密碼學》
PGP 全稱是 Pretty Good Privacy,是一個被設計用來加密信息,保護隱私的軟件。現(xiàn)在提到“PGP”, 基本上是說 OpenPGP 標準。
記錄片《第四公民》中 Edward Snowden 就是使用 PGP 與女記者 Laura Poitras 之間收發(fā)郵件的,以下來自電影截圖:
PGP能保證 一條信息是你相信的人發(fā)的,除了你倆之外別人無法解密, 而且這條消息在傳送時中間沒有經(jīng)過任何哪怕是一個標點一個字節(jié)的修改。
Github判定提交者只是依靠Git 客戶端設置的user.name 和 user.email 來判定身份,而不會去驗證真實性,也就是說你可以在你的倉庫提交記錄中偽造任何人的提交記錄。
具體危害可參見震驚!竟然有人在 GitHub 上冒充我的身份!
涌有了自己pgp key之后,就可以用 gpg-agent 來代替 OpenSSH Agent來進行 SSH操作了。不過替換了之后并不會增加SSH的安全性,額, 折騰精神不死嘛。
硬要說好處的話,大概就可以更方便地使用Yubikey(一種硬件加密智能卡)來SSH。
如果有其他好玩的用法,歡迎評論或郵件告訴我。
PGP目前支持的算法
除非量子計算機落地,目前來說2048位的RSA加密是不可破解的。
我們需要知道PGP、OpenPGP、GnuPG 和 gpg 之間的不同:
OpenPGP 是在 PGP 基礎上定義的開放標準,使得 PGP 技術可以由任何公司和個人實現(xiàn),而不需要繳納許可費用。標準草案指出 OpenPGP 提供的是數(shù)據(jù)完整性服務,賦予用戶查看、檢驗、生成和寫入加密信息、秘鑰和簽名的能力。 OpenPGP 通過加密、數(shù)字簽名、壓縮和 Radix-64 轉換來實現(xiàn)這些功能。
GnuPG 是 OpenPGP 協(xié)議的一種完備的實現(xiàn),除了按照 OpenPGP 協(xié)議提供數(shù)據(jù)加解密和簽名服務之外,它還提供了完整的秘鑰管理功能,并實現(xiàn)了協(xié)議中許多可選的加密或壓縮算法。
今天,“PGP”這個詞幾乎被普遍用來表示開放的 OpenPGP 標準,而不是最初的商業(yè)軟件,因此“PGP”和“OpenPGP”是可以互換的。
“GnuPG”和“gpg”這兩個詞應該僅在提及工具時使用,而不用于它們產(chǎn)生的輸出或它們實現(xiàn)的 OpenPGP 功能。舉例:
以下來自wiki:
菲利普·齊默曼(Philip R. Zimmermann)在1991年創(chuàng)造了第一個版本的PGP,其名稱“Pretty Good Privacy”的靈感來自于一個名為“Ralphs Pretty Good Grocery”的雜貨店——電臺主播Garrison Keillor虛構出來的一個名為Lake Wobegon的城市的一個雜貨店。
軟件第一個版本包含一個齊默曼自己設計的對稱密鑰算法,與周六夜現(xiàn)場的一個小品BassOmatic同名。作為一個老牌的反核能活躍分子,齊默曼為了讓所有有相似傾向的人們可以安全的使用BBS并且安全存儲消息和文件而創(chuàng)造了PGP加密。在非商業(yè)用途上是不需要授權的,無須任何費用,并且在所有的發(fā)行中附帶了完整的[2]的文章中,齊默曼描述了他最初開發(fā)PGP時的情景:
1991年的某天,我把PGP的第一版發(fā)給我?guī)讉€朋友,以便上傳到互聯(lián)網(wǎng)。我最先發(fā)給Allan Hoeltje,他把這個程序發(fā)到了Peacenet,一個針對草根政治組織--特別是“和平運動”--的ISP。當時全球政治活躍分子都能訪問到Peacenet。然后我又把它上傳給了Kelly Goen,他接著就把源碼轉發(fā)到了一個專門分發(fā)源代碼的Usenet新聞組。基于我的請求,他把該Usenet權限改為了“僅限美國”。Kelly還把PGP傳到了(美國)國內很多BBS上面。我記不太清剛開始在網(wǎng)上貼是6月5號還是6號。 說出來嚇人,1991年的時候,我對Usenet新聞組確是知之甚少。我并不知道那個“僅限美國”的標簽只是個“建議”作用,基本上對貼子的傳播(范圍)毫無影響。當時,我以為這個標簽會控制這個帖子的傳播范圍。當時我不知道如何在新聞組發(fā)貼,甚至不明白新聞組究竟是什么。
PGP在互聯(lián)網(wǎng)上傳播開來,并且在這個世界上獲得了非常多的擁護者。PGP用戶和支持者也包括在極權主義國家持不同政見的人們(一些給齊默曼的感人信件被發(fā)表了,其中一些在美國國會之前被包括到證據(jù)中)。在世界其它地方的公民自由意志主義支持者(參考齊默曼在各個聽政會上發(fā)表的證據(jù)),以及“自由通訊”激進主義分子,他們稱他們自己為加密愛好者,進行宣傳和分發(fā)。
建議你先參照后面教程,在隨便一臺機器上練習。 等熟練操作之后,再閱讀 安全使用 生成你真正主要使用的PGP密鑰對 :
brew install gpg
各發(fā)行版一般都會默認安裝GnuPG。
pkg_add gnupg
# step 0
gpg --full-gen-key
# 這里不推薦使用的 `gpg --gen-key`
# step 1
gpg (GnuPG) 2.2.20; Copyright (C) 2020 Free Software Foundation Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY to the extent permitted by law.
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(14) Existing key from card
Your selection?
# 默認就可以
# step 2
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072)
# 此處輸入你希望的密鑰長度, RSA的不應低于2048 bits,當然輸入的數(shù)字越大越安全,相應的,加解密的速度也會更慢
# step 3
Please specify how long the key should be valid.
0 = key does not expire
= key expires in n days
w = key expires in n weeks
m = key expires in n months
y = key expires in n years
Key is valid for? (0) 2y
# 默認可以選0 ,即永不過期, 這里我選了2y, 因為到期之前隨時可以更改你的過期時間,以確保你對此密鑰仍擁有控制權
# step 4
Key expires at Wed 11 Jan 2023 05:50:53 PM CST
Is this correct? (y/N) y
#確定
# step 5
GnuPG needs to construct a user ID to identify your key.
Real name: linus # 這里名字可以是網(wǎng)名,可以是任意名字,如果你注重隱私就不要輸入自己真名了
Email address: linus@outlook.com
Comment: # 備注可以留空
# 注意了: 這里的郵箱, 如果你不打算使用PGP為你的Git記錄認證, 這里其實是可以隨便輸入的,不需要是你的郵箱, 甚至不需要是一個真實存在的郵箱,只要接受你信息的人知道就行。隱私泄漏問題很嚴重,你一旦設置了,并且發(fā)布到公鑰服務器,就永遠刪不掉了 ?
# step 6
You selected this USER-ID:
"linus "
Change (N)ame (C)omment (E)mail or (O)kay/(Q)uit? o
# 確認無誤后輸入 o
# step 7
┌──────────────────────────────────────────────────────┐
│ Please enter the passphrase to │
│ protect your new key │
│ │
│ Passphrase: ________________________________________ │
│ │
│ │
└──────────────────────────────────────────────────────┘
# 輸入一個復雜的密碼 并確認
# step 8
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard move the mouse utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
# 隨機移動你的鼠標,越隨機你的密鑰越安全
# step 9 大功告成
gpg: key 99F583599B7E31F1 marked as ultimately trusted
gpg: revocation certificate stored as /root/.gnupg/openpgp-revocs.d/705358AB85366CAB05C0220F99F583599B7E31F1.rev
public and secret key created and signed.
pub rsa3072 2021-01-11 [SC]
705358AB85366CAB05C0220F99F583599B7E31F1 # 你的 key id
uid linus
sub rsa3072 2021-01-11 [E] # 這個是自動生成的用于加密的子密鑰,E代表Encrypt 加密
以下是常見縮寫釋義:
A => Authentication
C => Certify
E => Encrypt
S => Sign
? => Unknown capability
sec => Secret Key
ssb => Secret SuBkey
pub => Public Key
sub => Public Subkey
你日常使用應該使用子密鑰,主密鑰除了簽發(fā)新的子密鑰不要使用。
建議為不同環(huán)境,不同用途都多帶帶生成子密鑰,互不干擾。
# step 0
gpg --edit-key linus # 或者key id
# step 1 進入gpg交互界面
gpg (GnuPG) 2.2.20; Copyright (C) 2020 Free Software Foundation Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY to the extent permitted by law.
Secret key is available.
sec rsa3072/99F583599B7E31F1
created: 2021-01-11 expires: never usage: SC
trust: ultimate validity: ultimate
ssb rsa3072/6FE9C71CFED44076
created: 2021-01-11 expires: never usage: E
[ultimate] (1). linus C
# step 2
gpg> addkey
Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(14) Existing key from card
Your selection? 4
# 根據(jù)你的用途選擇, 這里生成一個只用于簽名的子密鑰(sign only)
# 后面的選擇和主密鑰生成的大同小異,按提示操作即可
# 生成完畢后
sec rsa3072/99F583599B7E31F1
created: 2021-01-11 expires: never usage: SC
trust: ultimate validity: ultimate
ssb rsa3072/6FE9C71CFED44076
created: 2021-01-11 expires: never usage: E
ssb rsa3072/FDB960B857D397F6
created: 2021-01-11 expires: never usage: S
[ultimate] (1). linus
# last step
gpg> save # 記得save, 直接退出的話什么也沒有
假如你忘了主密鑰的密碼,或者丟失了對主密鑰的控制權(丟失,被奪取),如果沒有撤銷憑證的話, 除了一個個通知你的朋友們沒有任何辦法 證明你不再使用這個密鑰,這簡直是災難。
# step 0
gpg --gen-revoke -ao revoke.pgp linus # uid 或者key id
# step 1
sec rsa3072/99F583599B7E31F1 2021-01-11 linus
Create a revocation certificate for this key? (y/N) y
Please select the reason for the revocation:
0 = No reason specified
1 = Key has been compromised
2 = Key is superseded
3 = Key is no longer used
Q = Cancel
(Probably you want to select 1 here) 3
# 按提示走完流程就可以
生成的revoke.pgp
就是撤銷憑證, 有了這個撤銷憑證,你可以在沒有密碼的情況下使一個公鑰失效,所以一定要妥善保存,而且最好比主密鑰多一份。
# 列出所有公鑰、子公鑰
gpg --list-keys
# 列出所有密鑰、子密鑰
gpg --list-secret-keys
# 簡化命令
gpg -k
gpg -K
# 輸出
sec rsa3072 2021-01-11 [SC]
705358AB85366CAB05C0220F99F583599B7E31F1
uid [ultimate] linus
ssb rsa3072 2021-01-11 [E]
ssb rsa3072 2021-01-11 [S]
這樣并沒有列出子密鑰的id 而且沒有打印出指紋信息, 是不安全的。所以在你查看密鑰時應該
--keyid-format long
輸出長ID--fingerprint
輸出指紋信息比如
gpg --fingerprint -K --keyid-format long
# 輸出
sec rsa3072/0x99F583599B7E31F1 2021-01-11 [SC] # 長ID
Key fingerprint = 7053 58AB 8536 6CAB 05C0 220F 99F5 8359 9B7E 31F1 #指紋信息
uid [ultimate] linus
ssb rsa3072/0x6FE9C71CFED44076 2021-01-11 [E] # 斜杠后面的就是子密鑰ID
ssb rsa3072/0xFDB960B857D397F6 2021-01-11 [S]
每次都打 --keyid-format long
和--fingerprint
很煩對不對, 編輯配置gpg文件 vim ~/.gnupg/gpg.conf
# ~/.gnupg/gpg.conf
keyid-format 0xlong
with-fingerprint
gpg -ao public-key.txt --export linus # 導出公鑰
# 注意這里最后 要帶上“!”, 不然會導出全部子密鑰
gpg -ao secret-key --export-secret-key 99F583599B7E31F1! # 導出主私鑰,建議secret-key 替換為你的加密設備備份文件的路徑,直接導入到設備中
gpg -ao sign-subkey --export-secret-subkeys FDB960B857D397F6! #導出有[S]標識、簽名用子私鑰
gpg -ao encrypt-subkey --export-secret-subkeys 6FE9C71CFED44076! #導出有[E]標識、加密用子私鑰 這里的ID替換為你的子密鑰ID
# 別忘了同時將你剛剛生成的撤銷憑證也備份起來
備份完后,要將本機的密鑰清除干凈,首先刪除:
gpg --delete-secret-keys linus # 刪除私鑰, UID 也可以替換成子密鑰ID 主密鑰Key ID
gpg --delete-keys linus # 刪除公鑰
# 如果想全部刪除推薦直接刪文件夾即刪除 $HOME/.gnupg
由于gpg生成的私鑰會在你的磁盤上使用明文儲存,所以一個多帶帶的 rm
或者右鍵刪除 并不能徹底刪除掉,可以使用 wipe 工具。如果你使用的是 SSD 且沒有 啟用全盤加密,是沒法徹底刪除的。
特別推薦使用 Tails (boum.org)發(fā)行版來生成主要使用的密鑰, 系統(tǒng)自帶pgp和paper key 等工具 可以確保全程斷網(wǎng)操作 同時此系統(tǒng)重啟會擦除所有內容,還免去了擦除密鑰的麻煩。
#從文件導入
gpg --import [密鑰文件] # 剛剛備份的子密鑰文件, 或者其他人的公鑰
# 暫不推薦從公鑰服務器導入,具體用法會在公鑰服務器一章介紹
# 這里先推薦 練習導入自己的子密鑰
# 輸出
sec# rsa3072/0x99F583599B7E31F1 2021-01-11 [SC] # sec 后面帶有 # 號說明主密鑰未導入,是安全的
Key fingerprint = 7053 58AB 8536 6CAB 05C0 220F 99F5 8359 9B7E 31F1 #指紋信息
uid [unknown] linus
ssb # rsa3072/0x6FE9C71CFED44076 2021-01-11 [E] # 帶有 # 號說明該子密鑰已導入
這里只講 如何簽名和驗證 他人文件, 為他人公鑰簽名和驗證 放在公鑰的發(fā)布和交換一章講解。
# 第一種方式,生成二進制簽名文件
gpg --sign input.txt # 當然也可以加上--output參數(shù)
# 第二種方式,生成ASCII格式簽名
gpg --clearsign input.txt
# 第三種,簽名和原文本分開(前兩種的簽名文件中包含了所有原文本,所以體積會比較大)
gpg --armor --detach-sign input.txt #不加armor生成會二進制
# 驗證簽名文件
gpg --verify demo.txt.asc demo.txt
# 加密:
# recipient指定接收者的公鑰ID
gpg --recipient {keyid/uid} --output encrypt.txt --encrypt input.txt
# 也可以按喜好加上--armor選項等
# 我更喜歡用
gpg -se -o encrypt.txt -r {keyid/uid} input.txt
# s代表簽名 e代表加密
# o是 將結果 輸出到文件 encrypt.txt
# r后面跟 接收者的 uid或者 key id, 接收者的公鑰必須已經(jīng)導入過
# input.txt 是你要加密的文件
# 解密:
gpg --decrypt encrypt.txt --output decrypt.txt
# 也可以
gpg -d encrypt.txt # 輸出到終端 直接查看
公鑰的交換是所有非對稱加密算法的脆弱點,所謂現(xiàn)代的使用方式,主要體現(xiàn)在密鑰的交換和發(fā)布上面, 之后會多帶帶來探討。
閱讀并理解本系列之前請不要發(fā)布你的公鑰到公鑰服務器。
由于PGP沒有提供任何將吊銷信息通知其他用戶的方式,他不能保證沒人會使用撤銷了的已經(jīng)變得不安全的密鑰。
你丟失的私鑰仍然可以被攻擊者使用,并用來解密那些沒有更新你的公鑰的人發(fā)送的加密消息。 revoke 子密鑰并更新公鑰后,若有人用老的公鑰加密信息,雖然你仍然可以解密,但是攻擊者同樣可以,這時候是極度不安全的。
例如:如果A的私人密鑰被盜,她將發(fā)出一個密鑰撤銷證書(key revocation certificate),但是由于這個密鑰的分發(fā)是非正式的且將費大量的時間和口舌,故不能保證密鑰環(huán)中每一個有A公開密鑰的用戶都能收到。由于A必須用她的私人密鑰簽名撤消的證書,所以如果A同時丟失了私人密鑰,她就不能撤銷密鑰。密鑰的撤銷問題被認為是整個系統(tǒng)最薄弱的環(huán)節(jié)。
所以在你將密鑰撤銷后,請將撤銷后的公鑰發(fā)布到你一貫公布公鑰的地方, 并盡可能通知其他人。
gpg --import gpg-linus.asc # 在一臺新的電腦上導入你的公鑰
gpg: key 99F583599B7E31F1: "linus " not changed
gpg: Total number processed: 1
gpg: unchanged: 1
gpg --import revoke # 導入你備份的撤銷憑證,直接會導致密鑰不可用
gpg: key 99F583599B7E31F1: "linus " revocation certificate imported
gpg: Total number processed: 1
gpg: new key revocations: 1
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 1 trust: 0- 0q 0n 0m 0f 1u
gpg: depth: 1 valid: 1 signed: 0 trust: 1- 0q 0n 0m 0f 0u
gpg: next trustdb check due at 2021-09-29
gpg -k # 查看密鑰,已經(jīng)revoke
pub rsa3072 2021-01-11 [SC] [revoked: 2021-01-11]
705358AB85366CAB05C0220F99F583599B7E31F1
uid [ revoked] linus
gpg --edit-key linus
gpg > list # 列出你所有的子密鑰
gpg > key {n} # 選擇你要銷毀的子密鑰的 序號
gpg > revkey
gpg > save # 退出前一定要save 不然所有更改不會生效
本文作者:UCloud后臺研發(fā)工程師 Hughes Chen
**博客地址:https://ulyc.github.io/
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/126015.html
摘要:上篇鏈接年,用更現(xiàn)代的方法使用上年,用更現(xiàn)代的方法使用中公鑰的發(fā)布與交換討論公鑰安全交換的中文文章比較少,而這一環(huán)是整個加密體系的重中之重。年月,有攻擊者惡意向公鑰服務器提交了對兩個著名網(wǎng)友的簽名背書。此事件中的受害者的證書就被簽名了次。上篇鏈接:2021年,用更現(xiàn)代的方法使用PGP(上)2021年,用更現(xiàn)代的方法使用PGP(中)PGP 公鑰的 發(fā)布 與 交換討論公鑰安全交換的中文文章比較少...
摘要:世界上有兩種密碼一種是防止你的小妹妹偷看你的文件另一種是防止當局閱讀你的文件應用密碼學上篇鏈接年,用更現(xiàn)代的方法使用上三安全使用和備份準備為了安全性,建議在一臺斷網(wǎng)的或者系統(tǒng)上生成你的密鑰對。世界上有兩種密碼:一種是防止你的小妹妹偷看你的文件;另一種是防止當局閱讀你的文件.? ...
摘要:一密碼學的術語分類術語密碼體制明文空間密文空間密鑰空間加密算法和解密算法五部分構成。柯克霍夫原則是現(xiàn)代密碼學設計的基本原則。特性散列函數(shù)特性消息的長度不受限制。 一、密碼學的術語、分類 1、術語 密碼體制:明文空間、密文空間、密鑰空間、加密算法和解密算法五部分構成。 密碼協(xié)議:有時稱為安全協(xié)議,指以密碼學為基礎的消息交換的通信協(xié)議,目的是在網(wǎng)絡環(huán)境 中提供各種...
摘要:目前,京東云金秋上云特惠也只是針對企業(yè)用戶的,云主機核限量秒殺僅元年。除非有相反證據(jù)證明外,用戶參與活動所獲得的全部權益和相應責任,均歸屬于參與活動的該京東云賬號所對應的實名認證主體。2021京東云金秋上云特惠早就開始了!一直忘記給大家傳達,不好意思哦,不過京東云體量小,買的個人用戶不并不多。目前,2021京東云金秋上云特惠也只是針對企業(yè)用戶的,云主機2核4G限量秒殺,僅155元/年。大家可...
閱讀 3514·2023-04-25 20:09
閱讀 3720·2022-06-28 19:00
閱讀 3035·2022-06-28 19:00
閱讀 3058·2022-06-28 19:00
閱讀 3132·2022-06-28 19:00
閱讀 2859·2022-06-28 19:00
閱讀 3014·2022-06-28 19:00
閱讀 2610·2022-06-28 19:00