2016-07-16 79 views
0

假設有一個加密文件file.txt的更新加密文件的使用gpg2和bash腳本內容

爲了更新其內容的文件必須首先被解密,然後通過所希望的處理和運行之後它必須再次加密。

(1)在使用gpg2的bash腳本中,最簡單的方法是什麼?該操作只能要求用戶輸入一次密碼才能解密。之後它應該使用相同的密碼進行最終加密。

這裏是什麼,我嘗試archieve最可能非常不安全的,但工作示例:

function update-encrypted-file() { 
    read pass_tmp; 
    local pass=$pass_tmp; 
    unset pass_tmp; 

    local file="file.txt"; 
    local tmp_result=$(cat $file | gpg2 --batch --passphrase $pass | update); 
    echo $tmp_result | gpg2 -c --batch --passphrase $pass > $file; 
} 

而更新可能是某事。像這樣:alias update="tr -d X"(刪除所有的X)

(2)究竟是什麼使上面的例子不安全?我猜想使用read本身是一個不行,但它會很有趣,看看爲什麼。沒有本地設置的變量會導致密碼在短時間內位於全局空間內。這可能會被提取?我無法弄清楚如何使用的pinentry-TTY在這種情況下(見this post)

(3)除此之外,關於--passphrase選項gpg2文檔的言論:「很顯然,這是非常值得懷疑的安全性上多「 僅當在終端內手動使用時纔會出現這種情況,因爲命令已記錄?或者在使用密碼的情況下使用例如函數時也會出現問題只保存在這個函數範圍內

回答

1

我沒有直接回答你的個人問題,但對密碼管理和GnuPG有一個小小的討論,但對於第三個問題:命令行全部爲程序全部用戶在機器上運行可用任何人。要確認,只需運行一個簡單的ps ax作爲非特權用戶。切勿將祕密作爲參數傳遞!

很明顯,最安全的選項將是永遠不會收到密碼短語。如果你沒有它,你就不能搞砸了。使用GnuPG 2.1,這甚至適用於實際的GnuPG二進制(gpg/gpg2):最重要的密鑰操作(涉及處理密碼短語)由小型gpg-agent執行(因此具有較小的攻擊面),相當大且複雜GnuPG二進制既不直接訪問密鑰也不直接訪問密碼。

這也是我想要的:代替處理密碼短語,取而代之的是依靠gpg-agent。它是可用的(並且因爲GnuPG 2.1,也是必需的)。如果配置正確(並且這是默認設置),gpg-agent會將密碼緩存一段時間。如果用戶配置了其他的東西,他決定他不想要緩存的密碼短語,你也應該尊重你的應用程序。

只要需要,gpg-agent將通過配置的方法向用戶查詢密碼短語 - 如果您正在運行圖形用戶界面,這可能會彈出一個窗口。

如果你惹的GnuPG配置(例如,你自己的配置文件,開始你自己的gpg-agent,...),這當然是你的工作來照顧這個。要啓動您自己的gpg-agent實例以全面控制緩存和其他選項,請根據您的個別用例的要求利用--options--homedir--no-use-standard-socket


最後,你存儲的內容的中間結果,你echo

local tmp_result=$(cat $file | gpg2 --batch --passphrase $pass | update); 
echo $tmp_result | gpg2 -c --batch --passphrase $pass > $file; 

不要爲密碼短語討論的同樣的理由這樣做!相反,直接將結果輸入加密過程(並且此處不需要cat):

< $file gpg2 --batch --passphrase $pass | update | gpg2 -c --batch --passphrase $pass > $file; 
+1

您確定最後一個示例應該有效嗎?我最終得到一個空文件而不是更新的文件。這是不是由於stdin和stdout到同一個文件的問題?例如像:文件 –

+1

的確,沒有想到這一點。但是最好寫一個臨時文件,然後移回來,而不是將內容存儲在變量中。您將遇到各種(大小)限制,最好不要存儲未加密的版本。 –

+1

並且爲了將來的參考,'echo $ unquotedVar'是一個shell反模式,當'\ r,\ n'或許多Ctrl-Chars在該值時肯定會引起麻煩。一般來說,dbl會引用所有變量!同意在這裏不需要它們,除了''$ file「,」$ pass「'。祝你們好運。 – shellter