प्रोग्राम पर स्टाॅक का हिस्सा बनने के लिए सबसे सुरक्षित और सरल तरीका है कि bash पर यूजर-टाइप किया गया पासवर्ड?


12

मैं (1) सबसे सुरक्षित और (2) सबसे आसान तरीका खोज रहा हूं जिसमें उपयोगकर्ता को एक बैश शेल प्रॉम्प्ट पर एक पासवर्ड टाइप करना है और उस पासवर्ड को एक प्रोग्राम में स्टड का हिस्सा बनना है।

यह वही है जो स्टडिन को देखने की जरूरत है: शेल प्रॉम्प्ट में टाइप किया हुआ {"username":"myname","password":"<my-password>"}कहां <my-password>है। यदि मुझे प्रोग्राम को स्टैडिन पर नियंत्रण था, तो मैं इसे पासवर्ड के लिए सुरक्षित रूप से संकेत करने के लिए संशोधित कर सकता हूं और इसे जगह में रख सकता हूं, लेकिन डाउनस्ट्रीम एक मानक सामान्य उद्देश्य कमांड है।

मैंने उन दृष्टिकोणों पर विचार किया और खारिज कर दिया है जो निम्नलिखित का उपयोग करते हैं:

  • कमांड लाइन में पासवर्ड टाइप करने वाला उपयोगकर्ता: पासवर्ड स्क्रीन पर दिखाया जाएगा और "ps" के माध्यम से सभी उपयोगकर्ताओं को भी दिखाई देगा
  • बाहरी प्रोग्राम (जैसे ...$PASSWORD...) के तर्क में शेल वेरिएबल इंटरपोलेशन : पासवर्ड अभी भी "ps" के माध्यम से सभी उपयोगकर्ताओं को दिखाई देगा
  • पर्यावरण चर (यदि वे पर्यावरण में छोड़ दिए जाते हैं): पासवर्ड सभी बाल प्रक्रियाओं को दिखाई देगा; यहां तक ​​कि भरोसेमंद प्रक्रियाएं पासवर्ड को उजागर कर सकती हैं यदि वे डायग्नोस्टिक के हिस्से के रूप में कोर या डंप पर्यावरण चर को डंप करते हैं
  • पासवर्ड एक फ़ाइल में समय की एक विस्तारित अवधि के लिए बैठे, यहां तक ​​कि तंग अनुमतियों के साथ एक फ़ाइल: उपयोगकर्ता गलती से पासवर्ड को उजागर कर सकता है और रूट उपयोगकर्ता गलती से पासवर्ड देख सकता है

मैं नीचे दिए गए उत्तर के रूप में अपना वर्तमान समाधान डालूंगा, लेकिन अगर कोई व्यक्ति किसी के साथ आता है तो वह बेहतर उत्तर का चयन करेगा। मैं सोच रहा हूं कि कुछ सरल होना चाहिए या हो सकता है कि किसी को सुरक्षा की चिंता दिखे, जो मुझे याद हो।


(पूर्ण उपयोग मामला यह है कि पासवर्ड को एक HTTPS सर्वर के लिए POST के मुख्य भाग की आवश्यकता होती है, लेकिन मैं इस प्रश्न को अधिक विशिष्ट नहीं बनाना चाहता। स्टड कर्ल के माध्यम से POST निकाय बन जाता है "-d @ - (।)
जिम होगलैंड

जवाबों:


14

के साथ bashया zsh:

unset -v password # make sure it's not exported
set +o allexport  # make sure variables are not automatically exported
IFS= read -rs password < /dev/tty &&
  printf '{"username":"myname","password":"%s"}\n' "$password" | cmd

इसके बिना IFS=, readआपके द्वारा टाइप किए गए पासवर्ड से खाली और लीडिंग को पीछे छोड़ देगा।

इसके बिना -r, यह एक उद्धृत चरित्र के रूप में बैकस्लैश की प्रक्रिया करेगा।

आप यह सुनिश्चित करना चाहते हैं कि आप केवल टर्मिनल से कभी पढ़ते हैं।

echoमज़बूती से इस्तेमाल नहीं किया जा सकता है। में bashऔर zsh, printfनिर्मित ताकि कमांड लाइन के उत्पादन में प्रदर्शित नहीं होता है ps

इसमें bash, आपको उद्धृत करने की आवश्यकता है $passwordअन्यथा विभाजन + ग्लोब ऑपरेटर इसे लागू किया जाता है।

यह अभी भी गलत है क्योंकि आपको उस स्ट्रिंग को JSON के रूप में एनकोड करना होगा। उदाहरण के लिए, डबल-कोट और बैकस्लैश कम से कम एक समस्या होगी। आपको शायद उन पात्रों के एन्कोडिंग के बारे में चिंता करने की आवश्यकता है। क्या आपका प्रोग्राम UTF-8 स्ट्रिंग्स की अपेक्षा करता है? आपका टर्मिनल क्या भेजता है?

के साथ एक शीघ्र स्ट्रिंग जोड़ने के लिए zsh:

IFS= read -rs 'password?Please enter a password: '

के साथ bash:

IFS= read -rsp 'Please enter a password: ' password

प्रिंटफ - यही कि हमें पर्ल आक्रमण से बचने की जरूरत है - अच्छा टिप। यह अच्छा है कि आपके पास unset passwordऔर set +aवहां है, हालांकि इसे छोड़ दिया जा सकता है यदि आप वर्तमान शेल के बारे में अधिक धारणा बना सकते हैं। IFS=विभिन्न प्रकार के पासवर्ड के साथ बेहतर सामान्यता के लिए -r विकल्प पढ़ने और इसके आगे रखने के बारे में अच्छा बिंदु । टर्मिनल से इनपुट को बाध्य करने के लिए / देव / tty से जाने के लिए अच्छा है।
जिम होगलैंड

1
हां, हमें अभी भी दोहरे-उद्धरण और बैकस्लैश और शायद एक जोड़े अन्य वर्णों के साथ समस्या है। हमें JSON ब्लॉब में डबल-उद्धृत फ़ील्ड के अंदर डालने से पहले उन्हें एनकोड करना होगा। सुनिश्चित नहीं है कि कर्ल UTF-8 की अपेक्षा करता है।
जिम होगलैंड

1
python3 -c 'import json; print(json.dumps({"username": "myname", "password": input()}))', अगर आपके पास पाइथन झूठ बोल रहा है। पायथन 2 के लिए, एस / इनपुट / रॉ_इनपुट /। यदि आप उस कमांड में पासवर्ड को पाइप करते हैं, तो यह उपयुक्त JSON को थूक देगा।
केविन

केविन, यह एक अच्छा सुझाव होगा यदि हम पासवर्ड को स्टैडिन में सुरक्षित रूप से प्राप्त कर सकते हैं और अजगर का आह्वान करने में कोई आपत्ति नहीं करेंगे। यह JSON मक्खी पर निर्माण करता है। यह अच्छी तरह से काम करेगा यदि पायथन के अंदर getpass.getpass () का उपयोग करें, हालांकि आप बार-बार संग्रहीत पासवर्ड का उपयोग करते रहने में सक्षम होने से चूक जाते हैं।
जिम होगलैंड

2

यहाँ मैं समाधान है (यह परीक्षण किया गया है):

$ read -s PASSWORD
<user types password>
$ echo -n $PASSWORD | perl -e '$_=<>; print "{\"username\":\"myname\",\"password\":\"$_\"}"'

स्पष्टीकरण:

  1. read -sस्क्रीन पर रेखा को प्रतिध्वनित किए बिना स्टडिन (पासवर्ड) की एक पंक्ति पढ़ता है। यह स्टोर शेल वैरिएबल PASSWORD में है।
  2. echo -n $PASSWORDपासवर्ड को बिना किसी न्यूलाइन के stdout पर रखता है। (प्रतिध्वनि एक शेल-इन-कमांड है इसलिए कोई नई प्रक्रिया नहीं बनाई गई है इसलिए (AFAIK) पासवर्ड को प्रतिध्वनि के तर्क के रूप में ps पर नहीं दिखाया जाएगा।)
  3. perl लगाया जाता है और स्टड से पासवर्ड को पढ़ता है $_
  4. perl $_पूर्ण पाठ में पासवर्ड डालता है और इसे stdout में प्रिंट करता है

यदि यह HTTPS POST पर जा रहा है, तो दूसरी पंक्ति कुछ इस प्रकार होगी:

echo -n $PASSWORD | perl -e '$_=<>; print "{\"username\":\"myname\",\"password\":\"$_\"}"' | curl -H "Content-Type: application/json" -d@- -X POST <url-to-post-to>

3
यह बहुत अच्छा लग रहा है। मैं बस ध्यान देता हूँ कि कोई भी कारण नहीं है; आप पूरी तरह से अच्छी तरह से कुछ कर सकते हैं printf '{"username":"myname","password":"%s"}' $PASSWORD, जो समान सुरक्षा गुणों को बरकरार रखता है और आपको एक बाहरी प्रक्रिया बचाता है।
टॉम हंट

2
आप का हल सामान्यीकरण करने के लिए चाहते हैं, तो readआदेश होते हैं जो -s ध्वज का समर्थन नहीं करते हैं, तो आप उपयोग कर सकते हैं "stty गूंज stty -echo; पढ़ने पासवर्ड"
जेफ स्कालर

2
पाइप दो नई प्रक्रियाओं को शुरू करता है, प्रत्येक पक्ष के लिए एक। बजाय एक यहाँ-स्ट्रिंग का उपयोग करें: perl -e '...' <<< "$PASSWORD"
Chepner

2
@chepner, एक अस्थायी फ़ाइल में सामग्री <<<को bashसंग्रहीत करता है जो बदतर है।
स्टीफन चेजलस

1
टीएलडीपी के अनुसार यह एक फाइल बनाता है लेकिन यह किसी भी अन्य प्रक्रियाओं द्वारा पठनीय नहीं है। "यहां दस्तावेज़ अस्थायी फ़ाइलें बनाते हैं, लेकिन ये फ़ाइलें खोलने के बाद हटा दी जाती हैं और किसी अन्य प्रक्रिया के लिए सुलभ नहीं होती हैं।" उदाहरण 19-12 के ठीक बाद tldp.org/LDP/abs/html/here-docs.html
ड्रैगन 88 --88

0

यदि आपके संस्करण का readसमर्थन नहीं करता है, -sतो आप इस उत्तर में देखा गया POSIX संगत तरीका आज़माएँ ।

echo -n "USERNAME: "; read uname
echo -n "PASSWORD: "; set +a; stty -echo; read passwd; command <<<"$passwd"; set -a; stty echo; echo
passwd= # get rid of passwd possibly only necessary if running outside of a script

set +aऑटो पर्यावरण के लिए एक चर के "निर्यात" को रोकने के लिए माना जाता है। आपको इसके लिए मैन पेज देखना चाहिए stty, बहुत सारे विकल्प उपलब्ध हैं। <<<"$passwd"अच्छा पासवर्ड रिक्त स्थान हो सकता है क्योंकि उद्धृत किया गया है। echoसक्षम करने के बाद अंतिम stty echoकमांड / आउटपुट को एक नई लाइन पर शुरू करना है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.