Đối số quy trình được hiển thị cho tất cả người dùng, nhưng môi trường chỉ hiển thị cho cùng một người dùng ( ít nhất là trên Linux và tôi nghĩ trên mọi biến thể unix hiện đại). Vì vậy, truyền mật khẩu thông qua một biến môi trường là an toàn. Nếu ai đó có thể đọc các biến môi trường của bạn, họ có thể thực thi các quy trình như bạn, vậy là trò chơi đã kết thúc.
Nội dung của môi trường có nguy cơ bị rò rỉ gián tiếp, ví dụ nếu bạn chạy ps
để điều tra một cái gì đó và vô tình sao chép-dán kết quả bao gồm các biến môi trường bí mật ở nơi công cộng. Một rủi ro khác là bạn chuyển biến môi trường cho một chương trình không cần đến nó (bao gồm cả con của quá trình cần mật khẩu) và chương trình đó phơi bày các biến môi trường của nó vì nó không bảo mật chúng. Làm thế nào xấu những rủi ro rò rỉ thứ cấp phụ thuộc vào quá trình với mật khẩu làm gì (nó chạy trong bao lâu? Nó có chạy các quy trình con không?).
Dễ dàng hơn để đảm bảo rằng mật khẩu sẽ không bị rò rỉ một cách tình cờ bằng cách chuyển nó qua một kênh không được thiết kế để nghe lén, chẳng hạn như đường ống. Điều này là khá dễ dàng để làm ở phía gửi. Ví dụ: nếu bạn có mật khẩu trong biến shell, bạn chỉ có thể làm
echo "$password" | theprogram
nếu theprogram
mong đợi mật khẩu trên đầu vào tiêu chuẩn của nó. Lưu ý rằng điều này là an toàn vì echo
là một nội dung; nó sẽ không an toàn với một lệnh bên ngoài vì đối số sẽ được đưa ra trong ps
đầu ra. Một cách khác để đạt được hiệu quả tương tự là với một tài liệu ở đây:
theprogram <<EOF
$password
EOF
Một số chương trình yêu cầu mật khẩu có thể được yêu cầu đọc nó từ một bộ mô tả tệp cụ thể. Bạn có thể sử dụng một mô tả tập tin khác với đầu vào tiêu chuẩn nếu bạn cần đầu vào tiêu chuẩn cho một cái gì đó khác. Ví dụ gpg
: với :
get-encrypted-data | gpg --passphrase-fd 3 --decrypt … 3<<EOP >decrypted-data
$password
EOP
Nếu chương trình không thể được yêu cầu đọc từ một bộ mô tả tệp nhưng có thể được yêu cầu đọc từ một tệp, bạn có thể yêu cầu nó đọc từ một bộ mô tả tệp bằng cách sử dụng tên tệp như `/ dev / fd / 3.
theprogram --password-from-file=/dev/fd/3 3<<EOF
$password
EOF
Trong ksh, bash hoặc zsh, bạn có thể làm điều này chính xác hơn thông qua quá trình thay thế.
theprogram --password-from-file=<(echo "$password")