อาร์กิวเมนต์ของกระบวนการสามารถมองเห็นได้โดยผู้ใช้ทุกคน แต่สภาพแวดล้อมนั้นปรากฏแก่ผู้ใช้คนเดียวกันเท่านั้น ( อย่างน้อยบน Linuxและฉันคิดว่าในทุกรุ่นของยูนิกซ์ที่ทันสมัย) ดังนั้นการส่งรหัสผ่านผ่านตัวแปรสภาพแวดล้อมจึงปลอดภัย หากใครบางคนสามารถอ่านตัวแปรสภาพแวดล้อมของพวกเขาพวกเขาสามารถดำเนินการตามที่คุณดังนั้นมันจบเกมแล้ว
เนื้อหาของสภาพแวดล้อมมีความเสี่ยงต่อการรั่วไหลทางอ้อมเช่นหากคุณเรียกใช้ps
เพื่อตรวจสอบบางสิ่งและคัดลอกผลลัพธ์โดยไม่ตั้งใจรวมถึงตัวแปรสภาพแวดล้อมที่เป็นความลับในที่สาธารณะ ความเสี่ยงอีกประการหนึ่งคือคุณส่งผ่านตัวแปรสภาพแวดล้อมไปยังโปรแกรมที่ไม่ต้องการ (รวมถึงชายด์ของกระบวนการที่ต้องการรหัสผ่าน) และโปรแกรมนั้นเปิดเผยตัวแปรสภาพแวดล้อมเนื่องจากไม่คาดหวังว่าจะเป็นความลับ ความเสี่ยงเหล่านี้ของการรั่วไหลทุติยภูมินั้นแย่เพียงใดขึ้นอยู่กับกระบวนการที่มีรหัสผ่านทำ (มันใช้เวลานานแค่ไหน?
เป็นการง่ายกว่าที่จะตรวจสอบให้แน่ใจว่ารหัสผ่านจะไม่รั่วไหลโดยไม่ตั้งใจโดยส่งผ่านช่องทางที่ไม่ได้ออกแบบมาให้ถูกดักข้อมูลเช่นไปป์ นี่เป็นเรื่องง่ายที่จะทำในด้านการส่ง ตัวอย่างเช่นหากคุณมีรหัสผ่านในตัวแปรเชลล์คุณสามารถทำได้
echo "$password" | theprogram
หากtheprogram
คาดว่ารหัสผ่านในอินพุตมาตรฐาน โปรดทราบว่านี่ปลอดภัยเพราะecho
เป็น builtin; มันจะไม่ปลอดภัยกับคำสั่งภายนอกเนื่องจากการโต้แย้งจะถูกเปิดเผยในการps
ส่งออก อีกวิธีหนึ่งในการบรรลุเอฟเฟกต์เดียวกันคือใช้เอกสาร here:
theprogram <<EOF
$password
EOF
บางโปรแกรมที่ต้องการรหัสผ่านสามารถบอกให้อ่านได้จากตัวให้คำอธิบายไฟล์เฉพาะ คุณสามารถใช้ file descriptor นอกเหนือจากอินพุตมาตรฐานหากคุณต้องการอินพุตมาตรฐานสำหรับอย่างอื่น ตัวอย่างเช่นด้วยgpg
:
get-encrypted-data | gpg --passphrase-fd 3 --decrypt … 3<<EOP >decrypted-data
$password
EOP
หากโปรแกรมไม่สามารถบอกให้อ่านจาก file descriptor แต่สามารถบอกให้อ่านจากไฟล์คุณสามารถบอกให้อ่านจาก file descriptor โดยใช้ชื่อไฟล์เช่น `/ dev / fd / 3
theprogram --password-from-file=/dev/fd/3 3<<EOF
$password
EOF
ใน ksh, bash หรือ zsh, คุณสามารถทำสิ่งนี้ได้อย่างกระชับยิ่งขึ้นผ่านการทดแทนกระบวนการ
theprogram --password-from-file=<(echo "$password")