1. 程式人生 > >資訊保安實驗--GPG的使用

資訊保安實驗--GPG的使用

GPG

這裡參考了"阮一峰的網路日誌"來進行實驗的,該部落格地址如下:

http://www.ruanyifeng.com/blog/2013/07/gpg.html

一、安裝

sudo apt-get install gnupg

我執行安裝命令時,發現系統已經自帶了GPG,所以打算直接使用自帶的GPG來做實驗。

安裝
我這裡的版本是1.4.20。

版本

它有的用法以及其它很多引數,可以通過–help來檢視

幫助

二、生成金鑰

gpg --gen-key

回車之後,會跳出一大段的文字,讓我們選擇要使用的加密演算法,預設是加密和簽名都使用REA,這裡我也選擇了預設項。

型別

接下來是金鑰長度,越長越安全,預設是2048位,這裡也是選擇預設,回車即可。

然後是期限,說明如下:

time

這裡由於金鑰只是我個人使用,並且能夠保證有效的保管私鑰,因此選擇了永不過期,也是預設選項。

回答完這些問題之後,系統會讓我們確認資訊,選y之後可以進入個人資訊的提供環節:

yes

這裡填寫真實資訊之後,會讓我們來最後確認一次:

ensure

輸入O表示確定之後,系統會讓我們設定私鑰的密碼,這樣一方面可以防止誤操作,也可以防止系統被侵入時有人擅自動用私鑰。

passwd

這裡一切就緒之後,金鑰生成就開始了,這個時候,它會提示我們做一些瑣事,並且如果做的不夠多,它還會有提示:

random

random2

三、遇見錯誤及解決方式

第一次走完整個步驟的時候,它報出瞭如下的錯誤:

error

我以為是沒有聯網的緣故開了熱點又進行了一次,依然報了這個錯,於是通過百度找到了一種錯誤原因以及解決方式:

今天在fedora的中文翻譯組上訂閱的時候,用到gpg,生成金鑰的時候,提示有gpg:找不到可寫的公鑰鑰匙環:eof (gpg: no writable public keyring found: eof)的錯誤,百度上搜了一下,竟然就一個網頁,而且還不對題;隨後google一下,把對應的英文提示搜出來了,再用這英文提示搜一下,嘿,找到答案了:

cd /root

mkdir .gunpg

chmod 555 .gnupg/

原來是因為沒有.gunpg這個目錄造成的。

這裡我看了我的root目錄,發現有.gunpg這個隱藏目錄,不過許可權卻不是555,所以我想可能這裡需要root許可權才能解決問題,所以我用如下命令運行了gpg

sudo gpg --gen-key

並且再跑了一遍整個流程

此時成功生成了公鑰和私鑰

success

這裡的D9358A6C是我"使用者ID"的Hash字串,可以用來代替"使用者ID"

四、生成"撤銷證書"

生成"撤銷證書"的目的是為了在以後金鑰作廢時,可以請求外部的公鑰伺服器來撤銷公鑰。

gpg --gen-revoke [使用者ID]

這裡使用者ID,我使用了剛才生成的Hash字串,並且填寫相關資訊之後,就能夠生成一個吊銷證書。

revoke

五、金鑰管理

1.列出金鑰

這裡仍然需要特權執行,否則會提示許可權不夠

sudo gpg --list-keys

list

第一行是公鑰檔名,第二行是私鑰特徵(2048位,Hash字串和生成時間),第三行是使用者ID,第四行是私鑰的特徵。

如果想要刪除某個金鑰,可以使用如下命令:

gpg --delete-key [使用者ID]

2.輸出金鑰

公鑰檔案是以二進位制形式儲存的,使用armor引數可以將其轉換為ASCII碼顯示

gpg --armor --output [輸出檔名] --export [使用者id]

私鑰檔案也可以用類似的方式轉換

gpg --armor --output [輸出檔名] --export-secret-keys

這裡如果有多個私鑰的話,可以用以下命令來輸出特定的私鑰

gpg -a -o [輸出檔名] --export-secret-keys [特定ID]

不過感覺似乎並不是所有版本都可行的,至少我一個同學的版本這條命令執行結果是失敗的

3.上傳公鑰

gpg --send-keys [使用者ID] --keyserver hkp://subkeys.pgp.net

使用該命令,可以將公鑰上傳到伺服器hkp://subkeys.pgp.net上,通過交換機制,所有公鑰伺服器最終都會包含自己的公鑰。

可以生成一個公鑰指紋來讓他人進行核對下載到的公鑰是否為真:

gpg --fingerprint [使用者ID]

4.輸入金鑰

匯入他人公鑰或者自己的其他金鑰

gpg --import [金鑰檔案]

從公鑰伺服器上獲取他人公鑰

gpg --keyserver hkp://subkeys.pgp.net --search-keys [使用者ID]

下載之後還需要用其他機制驗證。

六、加密和解密

1.加密

這裡我現在實驗目錄下新建了一個test.txt

createFile

然後利用命令進行加密

sudo gpg --recipient [使用者ID] --output test.en.txt --encrypt test.txt

這裡recipient後面指定接受者的公鑰,output後面是加密後的檔名,encrypt後面是原始檔。

執行之後可以檢視生成的檔案。

afterEn

可以看到已經無法看出原來的內容了。

2.解密

使用如下命令解密,這裡我來解密剛才生成的test.en.txt

sudo  gpg --decrypt test.en.txt

部落格中的命令後面有output引數,但是我這裡使用之後它會提示我用法錯誤,省略之後就正常了,不過檔案內容也是直接在命令列中列印了出來

執行結果如下:

afterDe

這裡省略decrypt也是可以的,gpg預設是執行解密。

後來我又試驗了一下這裡的輸出檔案方式,發現只要將–output引數放在–encrypt引數之前執行,就不會有問題,命令如下:

sudo gpg --output ./asc.txt --decrypt test.en.txt

decry2

可見,此時成功將解密內容輸出到了asc.txt中。

七、簽名

1. 對檔案簽名

簽名的目的是為了表示某個檔案確實是由本人發出的,使用sign引數來進行簽名。

這裡依然對之前建立的test.txt進行簽名。

sudo gpg --sign test.txt

執行之後,當前目錄下生成了一個demo.txt.gpg檔案,也就是簽名之後的檔案,這裡是二進位制形式儲存:

sign

也可以生成ASCII碼的簽名檔案,可以使用clearsign引數

sudo gpg --clearsign test.txt

這裡可以生成一個ASCII碼型別的簽名檔案

signasc

如果想生成單獨的簽名檔案,與檔案內容分開存放的話,可以用detach-sign引數

sudo gpg --detach-sign test.txt

這樣可以在目錄下生成一個單獨的二進位制形式簽名檔案test.txt.sig,如果想採用ASCII碼形式,需要加上armor引數。

sudo gpg --armor --detach-sign test.txt

dsignasc

可以在簽名的時候同時加密,示例如下:

sudo gpg --local-user [發信者ID] --recipient [接收者ID] --armor --sign --encrypt demo.txt

2.驗證簽名

使用verify引數就可以用對方的公鑰來對檔案簽名進行驗證,verify引數用來驗證。

sudo gpg --verify test.txt.asc test.txt

這裡執行結果如下:

versign

可見驗證成功。

八、DIY環節

這裡我利用gpg命令配合其他shell命令以及簡單的shell語句實現了一個簡單的密碼本程式,用來儲存自己其他的密碼,這樣只需要儲存好這個密碼檔案以及自己的金鑰,以及其對應的密碼即可。這個程式實現了建立密碼本、檢視所有密碼、新增密碼、查詢密碼的功能。

1.建立密碼本

	touch password.txt	#建立一個新檔案
	gpg --recipient LiHaoMing --output password.en.txt --encrypt password.txt	#加密這個檔案生成加密檔案
	rm password.txt	#刪除原檔案

執行如下:

create

可見,這裡建立了一個新的加密檔案。

2.新增密碼

這個邏輯略長,不過也很好理解

	while [ -z $des ];	#當描述為空時迴圈執行
	do
        echo 輸入密碼描述,不可空	#提示語句
        read des	#讀取輸入
    done
    while [ -z $username ];	#當用戶賬號為空時迴圈執行
    do
        echo 輸入賬號,不可空	#提示語句
        read username	#讀取輸入
    done
    while [ -z $password ];
    do
        echo 輸入密碼,不可空
        read password
    done
    gpg --output password.txt --decrypt password.en.txt    #解密檔案
    echo $des>>password.txt #新增描述
    echo $username $password>>password.txt
    rm password.en.txt  #移除加密檔案
    gpg --recipient LiHaoMing --output password.en.txt --encrypt password.txt #加密
    rm password.txt #移除密碼本

執行如下:

add

3.檢視所有密碼

	gpg --decrypt password.en.txt

執行如下:

read

4.查詢密碼

這裡用grep命令配合,通過密碼描述來查詢對應的賬號和密碼

    read keyword
    gpg --decrypt password.en.txt | grep $keyword -A 1

執行如下:

find

最後利用switch語句,通過引數的選擇來執行對應部分的功能即可,完整程式如下:

case $1 in
-m )
    #echo 建立新的空密碼本
    touch password.txt	#建立一個新檔案
    gpg --recipient LiHaoMing --output password.en.txt --encrypt password.txt #加密這個檔案生成加密檔案
    rm password.txt #刪除原檔案
    exit 0;;
-r )
    #echo 檢視密碼
    gpg --decrypt password.en.txt
    exit 0;;
-a )
    echo 新增密碼
    while [ -z $des ];
    do
        echo 輸入密碼描述,不可空
        read des
    done
    while [ -z $username ];
    do
        echo 輸入賬號,不可空
        read username
    done
    while [ -z $password ];
    do
        echo 輸入密碼,不可空
        read password
    done
    gpg --output password.txt --decrypt password.en.txt    #解密檔案
    echo $des>>password.txt #新增描述
    echo $username $password>>password.txt
    rm password.en.txt  #移除加密檔案
    gpg --recipient LiHaoMing --output password.en.txt --encrypt password.txt #加密
    rm password.txt #移除密碼本
    #echo $des $username $password
    exit 0;;
-f )
    echo 請輸入要查詢的關鍵字
    read keyword
    gpg --decrypt password.en.txt | grep $keyword -A 1
    exit 0;;
esac

這個程式還有很多需要完善的地方,比如說如果輸入過程中密碼輸錯了需要修改之類的情況沒有進行處理,因此以後有時間的話可以進一步的完成這個程式,此外就是一定要儲存好自己的金鑰、並記住對應的密碼,否則可能會讓輸進去的一堆密碼再也找不回來。