假設有一個加密文件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文檔的言論:「很顯然,這是非常值得懷疑的安全性上多「 僅當在終端內手動使用時纔會出現這種情況,因爲命令已記錄?或者在使用密碼的情況下使用例如函數時也會出現問題只保存在這個函數範圍內
您確定最後一個示例應該有效嗎?我最終得到一個空文件而不是更新的文件。這是不是由於stdin和stdout到同一個文件的問題?例如像:文件 –
的確,沒有想到這一點。但是最好寫一個臨時文件,然後移回來,而不是將內容存儲在變量中。您將遇到各種(大小)限制,最好不要存儲未加密的版本。 –
並且爲了將來的參考,'echo $ unquotedVar'是一個shell反模式,當'\ r,\ n'或許多Ctrl-Chars在該值時肯定會引起麻煩。一般來說,dbl會引用所有變量!同意在這裏不需要它們,除了''$ file「,」$ pass「'。祝你們好運。 – shellter