Environment-Variables

如何將密碼傳遞給子程序?

  • July 22, 2016

已知在命令行上傳遞密碼(給從我的程序啟動的子程序)是不安全的(因為即使使用 ps 命令的其他使用者也可以看到它)。可以將其作為環境變數傳遞嗎?

我還能用什麼來通過它?(環境變數除外)最簡單的解決方案似乎是使用管道,但這個最簡單的解決方案並不容易。

我用 Perl 程式。

程序參數對所有使用者可見,但環境僅對同一使用者可見(至少在 Linux 上,我認為在每個現代 unix 變體上)。所以通過環境變數傳遞密碼是安全的。如果有人可以讀取您的環境變數,他們就可以像您一樣執行程序,所以遊戲已經結束了。

環境的內容存在間接洩漏的風險,例如,如果您跑去ps調查某事並意外複製粘貼結果,包括公共場所的機密環境變數。另一個風險是您將環境變數傳遞給不需要它的程序(包括需要密碼的程序的子程序)並且該程序公開其環境變數,因為它不希望它們是機密的。這些二次洩漏的風險有多嚴重取決於帶有密碼的程序的作用(它執行多長時間?它執行子程序嗎?)。

通過將密碼通過非設計用於竊聽的通道(例如管道)傳遞,可以更輕鬆地確保密碼不會意外洩漏。這在發送端很容易做到。例如,如果你在 shell 變數中有密碼,你可以這樣做

echo "$password" | theprogram

iftheprogram期望其標準輸入上的密碼。請注意,這是安全的,因為echo它是內置的;使用外部命令是不安全的,因為參數會在ps輸出中公開。實現相同效果的另一種方法是使用此處的文件:

theprogram <<EOF
$password
EOF

一些需要密碼的程序可以被告知從特定的文件描述符中讀取密碼。如果您需要其他標準輸入,則可以使用標準輸入以外的文件描述符。例如,使用gpg

get-encrypted-data | gpg --passphrase-fd 3 --decrypt … 3<<EOP >decrypted-data
$password
EOP

如果程序不能被告知從文件描述符中讀取,但可以被告知從文件中讀取,您可以通過使用像`/dev/fd/3 這樣的文件名來告訴它從文件描述符中讀取。

theprogram --password-from-file=/dev/fd/3 3<<EOF
$password
EOF

在 ksh、bash 或 zsh 中,您可以通過程序替換更簡潔地做到這一點。

theprogram --password-from-file=<(echo "$password")

引用自:https://unix.stackexchange.com/questions/296297