কোনও প্রোগ্রামে স্ট্যাডিনের অংশ হয়ে বাশ-এ থাকা ব্যবহারকারী-টাইপ করা পাসওয়ার্ডটি সবচেয়ে নিরাপদ এবং সহজ উপায় কী?


12

আমি (1) সর্বাধিক সুরক্ষিত এবং (2) ব্যাশ শেল প্রম্পটে ব্যবহারকারীকে একটি পাসওয়ার্ড টাইপ করার সহজ উপায় এবং সেই পাসওয়ার্ডটি স্ট্যান্ডিনের একটি প্রোগ্রামে পরিণত করার সহজ উপায় way

স্টিডিনটি দেখতে এটির মতো: শেল প্রম্পটে টাইপ করা ছিল {"username":"myname","password":"<my-password>"}কোথায় where <my-password>স্ট্যান্ডিন প্রোগ্রামটির উপরে যদি আমার নিয়ন্ত্রণ থাকে তবে আমি এটি পাসওয়ার্ডের জন্য সুরক্ষিতভাবে প্রম্পট করার জন্য এটিকে সংশোধন করতে এবং এটি স্থানে রাখতে পারি, তবে ডাউনস্ট্রিমটি একটি সাধারণ সাধারণ উদ্দেশ্য কমান্ড।

নিম্নলিখিতগুলি ব্যবহার করে এমন পদ্ধতিগুলি আমি বিবেচনা করেছি এবং প্রত্যাখ্যান করেছি:

  • কমান্ড লাইনে পাসওয়ার্ড টাইপ করা ব্যবহারকারী: পাসওয়ার্ডটি স্ক্রিনে প্রদর্শিত হবে এবং "পিএস" এর মাধ্যমে সমস্ত ব্যবহারকারীর কাছে দৃশ্যমান হবে
  • একটি বহিরাগত প্রোগ্রামের (যেমন, ...$PASSWORD...) আর্গুমেন্টে শেল ভেরিয়েবল ইন্টারপোলেশন : পাসওয়ার্ডটি এখনও "পিএস" এর মাধ্যমে সমস্ত ব্যবহারকারীর কাছে দৃশ্যমান হবে
  • পরিবেশের পরিবর্তনশীল (যদি তারা পরিবেশে ছেড়ে যায়): সমস্ত শিশু প্রক্রিয়াটিতে পাসওয়ার্ডটি দৃশ্যমান হবে; এমনকি নির্ভরযোগ্য প্রক্রিয়াগুলি যদি ডায়াগনস্টিকের অংশ হিসাবে মূল বা ডাম্প পরিবেশের ভেরিয়েবলগুলি ডাম্প করে তবে পাসওয়ার্ডটি উন্মোচিত হতে পারে
  • পাসওয়ার্ডটি একটি প্রসারিত সময়ের জন্য একটি ফাইলের মধ্যে বসে, এমনকি শক্ত অনুমতি সহ একটি ফাইল: ব্যবহারকারী দুর্ঘটনাক্রমে পাসওয়ার্ডটি প্রকাশ করতে পারে এবং রুট ব্যবহারকারী ভুলক্রমে পাসওয়ার্ডটি দেখতে পারে

আমি আমার বর্তমান সমাধানটি নীচে একটি উত্তর হিসাবে রেখে দেব, তবে কেউ যদি তার সাথে আসে তবে আনন্দের সাথে আরও ভাল উত্তর নির্বাচন করব। আমি ভাবছি যে এখানে কিছু সহজ হওয়া উচিত বা সম্ভবত কেউ আমার সুরক্ষার জন্য উদ্বেগ হারিয়েছে sees


(সম্পূর্ণ ব্যবহারের ক্ষেত্রে হ'ল পাসওয়ার্ডটির কোনও এইচটিটিপিএস সার্ভারের কাছে কোনও পোষ্টের শৃঙ্খলার অংশ থাকা প্রয়োজন, তবে আমি এই প্রশ্নটিকে অত্যধিক নির্দিষ্ট করতে চাই না The - "।)
জিম হোগল্যান্ড

উত্তর:


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 হিসাবে এনকোড করা দরকার। উদাহরণস্বরূপ, কমপক্ষে ডাবল-কোট এবং ব্যাকস্ল্যাশ একটি সমস্যা হবে। আপনাকে সম্ভবত এই চরিত্রগুলির এনকোডিং সম্পর্কে চিন্তা করতে হবে। আপনার প্রোগ্রামটি কি ইউটিএফ -8 স্ট্রিংগুলি আশা করে? আপনার টার্মিনাল কি পাঠায়?

একটি প্রম্পট স্ট্রিং যুক্ত করতে zsh:

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

সহ bash:

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

প্রিন্টফ - পার্লের অনুরোধ এড়াতে আমাদের এটাই দরকার - ভাল টিপ। এটা তোলে আপনি যে ভাল unset passwordএবং set +aসেখানে যদিও এটা যদি আপনি বর্তমান শেল সম্পর্কে আরো অনুমানের করতে পারেন এড়ানো যাবে। IFS=বিভিন্ন পাসওয়ার্ড সহ আরও ভাল সাধারণতার জন্য পড়ার -আর বিকল্প সম্পর্কে ভাল পয়েন্ট point টার্মিনাল থেকে ইনপুট জোর করতে / dev / tty থেকে যাওয়া ভাল।
জিম হোগল্যান্ড

1
হ্যাঁ, আমাদের এখনও ডাবল-কোট এবং ব্যাকস্ল্যাশ এবং আরও কিছু অক্ষর নিয়ে সমস্যা রয়েছে। JSON ব্লাবে ডাবল-কোটেড ফিল্ডের ভিতরে রাখার আগে আমাদের তাদের এনকোড করা দরকার। কার্ল ইউটিএফ -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স্ক্রিনে লাইনটি প্রতিধ্বনিত না করে স্টিডিনের একটি লাইন (পাসওয়ার্ড) পড়ে। এটি সংরক্ষণ করে শেল ভেরিয়েবল পাস পাসওয়ার্ড।
  2. echo -n $PASSWORDস্ট্যান্ডআউটে কোনও নতুন লাইন ছাড়াই পাসওয়ার্ড রাখে। (প্রতিধ্বনি হ'ল একটি অন্তর্নির্মিত কমান্ড তাই কোনও নতুন প্রক্রিয়া তৈরি হয় না তাই (এএফএআইকে) প্রতিধ্বনি হিসাবে পাসওয়ার্ডটি পিএসে প্রদর্শিত হবে না।)
  3. পার্লকে অনুরোধ করা হয় এবং স্টিডিন থেকে পাসওয়ার্ড পড়ে $_
  4. পার্ল $_পুরো পাঠ্যে পাসওয়ার্ডটি প্রবেশ করে এবং স্টাডাউটে প্রিন্ট করে

এটি যদি এইচটিটিপিএস পোস্টে চলে যায় তবে দ্বিতীয় লাইনটি এমন কিছু হবে:

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"
চিপনার

2
@chepner, <<<মধ্যে bashযা খারাপ একটি অস্থায়ী ফাইল সঞ্চয় সামগ্রী অন্তর্ভুক্ত রয়েছে।
স্টাফেন চেজেলাস

1
টিএলডিপি অনুসারে এটি একটি ফাইল তৈরি করে তবে এটি অন্য কোনও প্রক্রিয়া দ্বারা পঠনযোগ্য নয়। "এখানে নথিগুলি অস্থায়ী ফাইল তৈরি করে, তবে এই ফাইলগুলি খোলার পরে মুছে ফেলা হয় এবং অন্য কোনও প্রক্রিয়াতে অ্যাক্সেসযোগ্য নয়" " tldp.org/LDP/abs/html/here-docs.html উদাহরণ 19-12 এর ঠিক পরে।
ড্রাগন 788

0

যদি আপনার সংস্করণটি readসমর্থন না -sকরে তবে আপনি এই উত্তরে পোসিক্সের সামঞ্জস্যপূর্ণ উপায়টি ব্যবহার করে দেখুন ।

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হল একটি নতুন লাইনে পরবর্তী কমান্ড / আউটপুট শুরু করা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.