প্রবেশ করা পাসওয়ার্ড কীভাবে চেক করবেন এই ব্যবহারকারীর জন্য একটি বৈধ পাসওয়ার্ড?


15

দৃশ্য:

ব্যাশ স্ক্রিপ্টে, আমাকে ব্যবহারকারীর দেওয়া পাসওয়ার্ডটি বৈধ ব্যবহারকারীর পাসওয়ার্ড কিনা তা আমাকে পরীক্ষা করতে হবে।

অর্থাৎ ধরুন আমার কাছে পাসওয়ার্ড পিএ সহ একটি ব্যবহারকারী আছে .. স্ক্রিপ্টে আমি ব্যবহারকারী এটিকে তার পাসওয়ার্ড লিখতে বলেছিলাম, তাহলে কীভাবে পরীক্ষা করা স্ট্রিংটি তার পাসওয়ার্ড কিনা তা কীভাবে পরীক্ষা করব? ...


বৈধ পাসওয়ার্ড দিয়ে আপনি কী বোঝাতে চাইছেন? এটি যদি সত্যই ব্যবহারকারীর পাসওয়ার্ড হয় তা পরীক্ষা করতে চান?
এবি

@ এএইচ বৈধ পাসওয়ার্ড = লগইন পাসওয়ার্ড যাই হোক না কেন আপনি কল করতে চান ... আমার অর্থ এটি এই ব্যবহারকারীর জন্য একটি পাসওয়ার্ড
মেথাক্স

@ এ্যাব আমি জানি এটি একটি সুরক্ষা গর্ত হবে তবে এখানে আপনি ইতিমধ্যে ব্যবহারকারীর নামটিও জানেন ... অন্য কথায় পাসওয়ার্ড যদি এই ব্যবহারকারীর জন্য থাকে তবে এটি কেবল একটি পরীক্ষা ..
মেথক্স

3
আপনার উত্তরটি এখানে: unix.stackexchange.com/a/21728/107084
এবি

স্ট্যাকওভারফ্লো . com/ a/ 1503831/320594expect এ ভিত্তিক একটি সমাধান ।
জাইমে হাবলুটজেল

উত্তর:


15

আপনি যেহেতু শেল স্ক্রিপ্টে এটি করতে চান, তাই লিনাক্সের সাথে পাসওয়ার্ড কীভাবে চেক করবেন তাতে বেশ কয়েকটি অবদান রয়েছে ? ( ইউনিক্স.এসে , এবি দ্বারা প্রস্তাবিত ) বিশেষভাবে প্রাসঙ্গিক:

স্ট্রিংটি সত্যই কোনও ব্যবহারকারীর পাসওয়ার্ড কিনা তা ম্যানুয়ালি পরীক্ষা করতে আপনাকে ব্যবহারকারীর ছায়া প্রবেশের মতো লবণের সাথে ব্যবহারকারীর ছায়া প্রবেশের মতো একই হ্যাশ অ্যালগরিদম দিয়ে হ্যাশ করতে হবে । তারপরে এটি সেখানে সঞ্চিত পাসওয়ার্ড হ্যাশের সাথে তুলনা করা যেতে পারে।

কীভাবে এটি করা যায় তা প্রদর্শন করে আমি একটি সম্পূর্ণ, কার্যকারী স্ক্রিপ্ট লিখেছি।

  • যদি আপনি এটির নাম দেন chkpass, আপনি চালনা করতে পারেন এবং এটি স্ট্যান্ডার্ড ইনপুট থেকে একটি লাইন পড়বে এবং এটির পাসওয়ার্ড কিনা তা পরীক্ষা করবে ।chkpass useruser
  • এই স্ক্রিপ্ট নির্ভর করে এমন ইউটিলিটিটি অর্জনের জন্য whois Whois ইনস্টল করুন প্যাকেজটি ইনস্টল করুন mkpasswd
  • সফল হওয়ার জন্য এই স্ক্রিপ্টটি অবশ্যই রুট হিসাবে চালানো উচিত।
  • প্রকৃত কাজটি করার জন্য এই স্ক্রিপ্ট বা এর কোনও অংশ ব্যবহার করার আগে দয়া করে নীচে সুরক্ষা নোট দেখুন।
#!/usr/bin/env bash

xcorrect=0 xwrong=1 enouser=2 enodata=3 esyntax=4 ehash=5  IFS=$
die() {
    printf '%s: %s\n' "$0" "$2" >&2
    exit $1
}
report() {
    if (($1 == xcorrect))
        then echo 'Correct password.'
        else echo 'Wrong password.'
    fi
    exit $1
}

(($# == 1)) || die $esyntax "Usage: $(basename "$0") <username>"
case "$(getent passwd "$1" | awk -F: '{print $2}')" in
    x)  ;;
    '') die $enouser "error: user '$1' not found";;
    *)  die $enodata "error: $1's password appears unshadowed!";;
esac

if [ -t 0 ]; then
    IFS= read -rsp "[$(basename "$0")] password for $1: " pass
    printf '\n'
else
    IFS= read -r pass
fi

set -f; ent=($(getent shadow "$1" | awk -F: '{print $2}')); set +f
case "${ent[1]}" in
    1) hashtype=md5;;   5) hashtype=sha-256;;   6) hashtype=sha-512;;
    '') case "${ent[0]}" in
            \*|!)   report $xwrong;;
            '')     die $enodata "error: no shadow entry (are you root?)";;
            *)      die $enodata 'error: failure parsing shadow entry';;
        esac;;
    *)  die $ehash "error: password hash type is unsupported";;
esac

if [[ "${ent[*]}" = "$(mkpasswd -sm $hashtype -S "${ent[2]}" <<<"$pass")" ]]
    then report $xcorrect
    else report $xwrong
fi

সুরক্ষা নোট

এটি সঠিক পদ্ধতির নাও হতে পারে।

এর মতো কোনও পদ্ধতির সুরক্ষিত এবং অন্যথায় উপযুক্ত হিসাবে বিবেচনা করা উচিত কিনা তা আপনি ব্যবহারের ক্ষেত্রে যে বিবরণ প্রদান করেন নি তার উপর নির্ভর করে (এই লেখার হিসাবে)।

এটির নিরীক্ষা করা হয়নি।

যদিও আমি এই স্ক্রিপ্টটি লেখার সময় যত্ন নিয়ে ব্যায়াম করার চেষ্টা করেছি, তবে সুরক্ষা দুর্বলতার জন্য এটি সঠিকভাবে নিরীক্ষণ করা হয়নি । এটি একটি বিক্ষোভ হিসাবে উদ্দিষ্ট, এবং কোনও প্রকল্পের অংশ হিসাবে প্রকাশিত হলে "আলফা" সফ্টওয়্যার হবে। উপরন্তু ...

আর একজন ব্যবহারকারী যিনি "দেখছেন" ব্যবহারকারীর লবণের সন্ধান করতে পারবেন ।

mkpasswdলবণের ডেটা কীভাবে গ্রহণ করে তার সীমাবদ্ধতার কারণে , এই স্ক্রিপ্টটিতে একটি ज्ञात সুরক্ষা ত্রুটি রয়েছে , যা আপনি ব্যবহারের ক্ষেত্রে নির্ভর করে গ্রহণযোগ্য বলে বিবেচনা করতে পারেন বা নাও করতে পারেন। ডিফল্টরূপে, উবুন্টু এবং বেশিরভাগ অন্যান্য জিএনইউ / লিনাক্স সিস্টেমের ব্যবহারকারীরা তাদের ব্যবহারকারী-কমান্ড-লাইন আর্গুমেন্ট সহ (রুট সহ) চালিত প্রক্রিয়াগুলির তথ্য দেখতে পারেন can ব্যবহারকারীর ইনপুট বা সঞ্চিত পাসওয়ার্ড হ্যাশ কোনও বাহ্যিক ইউটিলিটিতে কমান্ড-লাইন আর্গুমেন্ট হিসাবে পাস করা হয় না। কিন্তু লবণ , থেকে নিষ্কাশিত shadowডাটাবেস, হয় একটি কম্যান্ড-লাইন আর্গুমেন্ট হিসাবে প্রদত্ত mkpasswdযেহেতু এই একমাত্র উপায় যে ইউটিলিটি ইনপুট হিসাবে একটি লবণ গ্রহণ করে।

যদি

  • সিস্টেমের অন্য ব্যবহারকারী, বা
  • যে কেউ যেকোনও ব্যবহারকারী অ্যাকাউন্ট তৈরি করার ক্ষমতা রাখে (যেমন, www-data) তাদের কোড চালায়, বা
  • যে কেউ অন্যথায় চলমান প্রক্রিয়াগুলি সম্পর্কে তথ্য দেখতে পারেন (ম্যানুয়ালি এন্ট্রিগুলি পরিদর্শন করে /proc)

mkpasswdএই স্ক্রিপ্ট দ্বারা চালিত হিসাবে এটি কমান্ড-লাইন আর্গুমেন্টগুলি পরীক্ষা করতে সক্ষম হয় , তারপরে তারা shadowডাটাবেস থেকে ব্যবহারকারীর লবণের একটি অনুলিপি পেতে পারে । তারা পারে অনুমান করতে সমর্থ হতে হবে যখন যে কমান্ডটি প্রয়োগ করা হয়, কিন্তু যে কখনও কখনও সাধনযোগ্য।

আপনার লবণের সাথে আক্রমণকারী আপনার লবণ এবং হ্যাশের আক্রমণকারী হিসাবে খারাপ নয় , তবে এটি আদর্শ নয়। আপনার পাসওয়ার্ড আবিষ্কার করার জন্য কারও পক্ষে লবণ পর্যাপ্ত তথ্য সরবরাহ করে না। তবে এটি যে কারওর জন্য সেই সিস্টেমটিতে ব্যবহারকারীর জন্য নির্দিষ্ট রেইনবো টেবিল বা প্রাক-গণিত অভিধান হ্যাশগুলি তৈরি করতে দেয় । এটি প্রাথমিকভাবে মূল্যহীন, তবে যদি আপনার সুরক্ষা পরবর্তী তারিখে আপস করা হয় এবং পুরো হ্যাশ পাওয়া যায়, তবে এটির পরিবর্তনের সুযোগ পাওয়ার আগে ব্যবহারকারীর পাসওয়ার্ড পেতে এটি আরও দ্রুত ফাটল যেতে পারে ।

সুতরাং এই সুরক্ষা ত্রুটিটি সম্পূর্ণরূপে কাজে লাগানো দুর্বলতার চেয়ে আরও জটিল আক্রমণ দৃশ্যের এক উদ্বেগজনক কারণ। এবং আপনি উপরের পরিস্থিতি সুদূর বিবেচনা করতে পারেন। তবে আমি সাধারণ, বাস্তব-বিশ্বের ব্যবহারের জন্য এমন কোনও পদ্ধতির সুপারিশ করতে নারাজ যা কোনও অ-রুট ব্যবহারকারী থেকে কোনও অ-পাবলিক ডেটা ফাঁস করে দেয় /etc/shadow

আপনি এই সমস্যাটি সম্পূর্ণরূপে এড়াতে পারবেন:

  • পার্ল বা করতে দেয় যদি অন্য কোন ভাষায় আপনার স্ক্রিপ্টের অংশ লেখা হিসাবে আপনি, সি ফাংশান কল গিলেজ এর উত্তর দেখানো থেকে এর সাথে সম্পর্কিত Unix.SE প্রশ্ন , বা
  • বাশ ব্যবহার না করে আপনার সম্পূর্ণ স্ক্রিপ্ট / প্রোগ্রামটি এ জাতীয় ভাষায় লেখা। (আপনি যেভাবে প্রশ্নটি ট্যাগ করেছেন তার উপর ভিত্তি করে, এটি প্রদর্শিত হয় আপনি ব্যাশ ব্যবহার করতে পছন্দ করেন))

আপনি কীভাবে এই স্ক্রিপ্টটি কল করবেন তা যত্নবান হন।

যদি আপনি কোনও অবিশ্বস্ত ব্যবহারকারীকে এই স্ক্রিপ্টটিকে মূল হিসাবে চালিত করতে বা কোনও স্ক্রিপ্টকে রুট হিসাবে চালিত করার অনুমতি দেয় তবে সতর্কতা অবলম্বন করুন । অথবা - পরিবেশ পরিবর্তন করে, তারা এই স্ক্রিপ্ট করতে পারেন কোনো স্ক্রিপ্ট যে রুট হিসাবে রান - না কিছু । যদি না আপনি এটিকে আটকাতে না পারেন তবে আপনাকে অবশ্যই শেল স্ক্রিপ্টগুলি চালানোর জন্য ব্যবহারকারীদের উন্নত সুবিধাগুলি মঞ্জুর করতে হবে না।

10.4 দেখুন এই বিষয়ে আরও তথ্যের জন্য ডেভিড এ। হুইলারের সিকিউর প্রোগ্রামিং ফর লিনাক্স এবং ইউনিক্স হাওটো- তে শেল স্ক্রিপ্টিং ল্যাঙ্গুয়েজগুলি (sh এবং csh ডেরিভেটিভস) । যদিও তার উপস্থাপনাটি সেটুয়েড স্ক্রিপ্টগুলিতে ফোকাস করে, অন্য প্রক্রিয়াগুলি যদি পরিবেশকে সঠিকভাবে স্যানিটাইজ না করে তবে কিছু একই সমস্যার শিকার হতে পারে।

অন্যান্য নোট

এটি shadowকেবল ডাটাবেস থেকে হ্যাশ পড়ার সমর্থন করে।

এই স্ক্রিপ্টটি কাজ করার জন্য পাসওয়ার্ড ছায়াযুক্ত করা উচিত (অর্থাত, তাদের হ্যাশগুলি একটি পৃথক /etc/shadowফাইলে থাকা উচিত যা কেবলমাত্র রুটটিই পড়তে পারে, না /etc/passwd)

উবুন্টুতে সর্বদা এটি হওয়া উচিত। যাই হোক, প্রয়োজনে স্ক্রিপ্ট জাভাস্ক্রিপ্টে গার্বেজ থেকে পাসওয়ার্ড হ্যাশ পড়তে বাড়ানো যেতে পারে passwdসেইসাথে shadow

IFSএই স্ক্রিপ্টটি সংশোধন করার সময় মনে রাখবেন ।

আমি IFS=$শুরুতে সেট করেছি , যেহেতু ছায়া প্রবেশের হ্যাশ ক্ষেত্রে তিনটি ডেটা পৃথক করা হয়েছে $

  • তারা একটি নেতৃস্থানীয় আছে $যে কারণে হ্যাশ ধরন এবং লবন, "${ent[1]}"এবং "${ent[2]}"বদলে "${ent[0]}"এবং "${ent[1]}"যথাক্রমে।

এই স্ক্রিপ্টের একমাত্র জায়গায় যেখানে $IFSনির্ধারণ করে কিভাবে শেল টুকরা বা সম্মিলন শব্দ

  • যখন এই ডেটাগুলিকে বিন্যস্ত $( )কমান্ড প্রতিস্থাপন থেকে এটি শুরু করে একটি অ্যারেতে বিভক্ত করা হয়:

    set -f; ent=($(getent shadow "$1" | awk -F: '{print $2}')); set +f
  • যখন অ্যারের পূর্ণ ক্ষেত্রের সাথে তুলনা করতে একটি স্ট্রিংয়ে পুনর্গঠন করা হয় shadow, তখন "${ent[*]}"প্রকাশটি:

    if [[ "${ent[*]}" = "$(mkpasswd -sm $hashtype -S "${ent[2]}" <<<"$pass")" ]]

আপনি যদি স্ক্রিপ্টটি পরিবর্তন করেন এবং এটি অন্যান্য পরিস্থিতিতে শব্দ বিভাজন (বা শব্দ যোগদান) সম্পাদন করে থাকেন তবে আপনাকে IFSবিভিন্ন কমান্ড বা স্ক্রিপ্টের বিভিন্ন অংশের জন্য বিভিন্ন মান সেট করতে হবে।

আপনি যদি এটিকে মনে না রাখেন এবং ধরে $IFSনিলেন যে স্বাভাবিক হোয়াইট স্পেস ( $' \t\n') এ সেট করা থাকে তবে আপনি আপনার স্ক্রিপ্টটি বেশ সুন্দর কিছু অদ্ভুত বলে মনে হচ্ছে making


8

আপনি এটির sudoজন্য অপব্যবহার করতে পারেন । ব্যবহারকারী রয়েছে সুডো সুবিধাগুলি পরীক্ষা করার জন্য এবং স্টিডিনের পাসওয়ার্ডে পড়ার জন্য বিকল্প sudoরয়েছে । যাইহোক, ব্যবহারকারী যে সুবিধাপ্রাপ্ত স্তরের তা বিবেচনাধীন নয়, যদি সফলভাবে প্রমাণীকৃত হয় তবে প্রস্থান স্থিতি 0 দিয়ে ফিরে আসে। সুতরাং, আপনি অন্য যে কোনও প্রস্থান স্থিতিটি প্রমাণ করতে পারবেন না যে ইঙ্গিত হিসাবে গ্রহণ করতে পারেন (ধরে নিলেন যে কোনও সমস্যা নেই, যেমন অনুমতি ত্রুটি বা অবৈধ কনফিগারেশন)।-l-Ssudosudosudoers

কিছুটা এইরকম:

#! /bin/bash
IFS= read -rs PASSWD
sudo -k
if sudo -lS &> /dev/null << EOF
$PASSWD
EOF
then
    echo 'Correct password.'
else 
    echo 'Wrong password.'
fi

এই স্ক্রিপ্টটি sudoersকনফিগারেশনের উপর বেশ খানিকটা নির্ভর করে । আমি ডিফল্ট সেটআপ ধরে নিয়েছি। যে বিষয়গুলি এটি ব্যর্থ হতে পারে:

  • targetpwবা runaspwসেট করা আছে
  • listpw হয় never
  • প্রভৃতি

অন্যান্য সমস্যার মধ্যে রয়েছে (ধন্যবাদ এলিয়াহ):

  • ভুল প্রচেষ্টা লগ ইন করা হবে /var/log/auth.log
  • sudoআপনি যা ব্যবহারকারী হিসাবে অনুমোদন করছেন তা অবশ্যই চালানো উচিত। আপনি sudoচালাতে পারেন যাতে আপনার সুবিধাগুলি না থাকলে তার sudo -u foo sudo -lSমানে আপনাকে লক্ষ্য ব্যবহারকারী হিসাবে স্ক্রিপ্টটি চালাতে হবে।

এখন, যে কারণে আমি এখানে ডক্স ব্যবহার করেছি তা হ'ল শ্রবণশক্তি বাধাগ্রস্ত করা। কমান্ড লাইন অংশ হিসাবে ব্যবহৃত একটি পরিবর্তনশীল আরও সহজে ব্যবহার করে প্রকাশ করা হয় topবা psপ্রসেস পরিদর্শন করা বা অন্য সরঞ্জাম।


2
এই উপায়টি দুর্দান্ত দেখাচ্ছে। যদিও এটি অস্বাভাবিক sudoকনফিগার (যেমন আপনি বলেছেন) এবং /var/log/auth.logপ্রতিটি চেষ্টার রেকর্ডের সাথে ছড়িয়ে ছিটিয়ে থাকা সিস্টেমে কাজ করবে না , এটি দ্রুত, সহজ এবং চাকাটিকে পুনরায় উদ্দীপনার পরিবর্তে একটি বিদ্যমান ইউটিলিটি ব্যবহার করে (তাই কথা বলার জন্য)। আমি হোয়াইটস্পেস-প্যাডেড ইউজার ইনপুট এবং নন-প্যাডযুক্ত পাসওয়ার্ডগুলির মিথ্যা সাফল্যগুলি, সেইসাথে হোয়াইটস্পেস-প্যাডেড ইউজার ইনপুট এবং প্যাডযুক্ত পাসওয়ার্ডগুলির জন্য মিথ্যা সাফল্যগুলি রোধ করার IFS=জন্য পরামর্শ দেওয়ার পরামর্শ দিচ্ছি read। (আমার সমাধানের ক্ষেত্রেও অনুরূপ বাগ রয়েছে)) আপনি এটিও ব্যাখ্যা করতে চাইতে পারেন যে এটির ব্যবহারকারীর পাসওয়ার্ড চেক করা হচ্ছে কীভাবে এটি চালানো উচিত।
এলিয়াহ কাগন

@ এলিয়াকাগান প্রতিটি ব্যর্থ প্রচেষ্টা লগ হয়েছে, তবে হ্যাঁ, আপনি সমস্ত কিছু সম্পর্কে ঠিক বলেছেন right
মুড়ু

সফল প্রমাণীকরণ লগ হয়। sudo -l" COMMAND=list" দিয়ে লেখার জন্য একটি এন্ট্রি দেয় । বিটিডাব্লু (সম্পর্কিত নয়) যদিও এটি উদ্দেশ্যমূলকভাবে করা ভাল নয়, তবে এখানে নথির জায়গায় একটি স্ট্রিং ব্যবহার করা একই সুরক্ষা লক্ষ্য অর্জন করে এবং আরও কমপ্যাক্ট। যেহেতু স্ক্রিপ্ট ইতিমধ্যে bashisms ব্যবহার read -sএবং &>ব্যবহার if sudo -lS &>/dev/null <<<"$PASSWD"; thenকম পোর্টেবল। আমি প্রস্তাব দিচ্ছি না যে আপনার যা আছে তা পরিবর্তন করা উচিত (এটি ঠিক আছে)। বরং আমি এটি উল্লেখ করেছি যাতে পাঠকরা জানতে পারেন যে তাদের কাছে এই বিকল্পও রয়েছে।
এলিয়াহ কাগন

@ এলিয়াকাগান আহ। আমি ভেবেছিলাম sudo -lকিছু অক্ষম করেছে - সম্ভবত যখন এটি ব্যবহার করা হয়েছিল যখন কোনও ব্যবহারকারী কোনও কমান্ড চালানোর চেষ্টা করে যা তাদের অনুমতিপ্রাপ্ত নয়।
মুড়ু

পছন্দ করেছেন আমি আগে এইভাবে হরস্ট্রিংস ব্যবহার করেছি । আমি এখানে একটি ভ্রান্ত ধারণার অধীনে শ্রম নিচ্ছিলাম, যার ফলে বংশগতি ঘটেছিল, তবে তারপরে আমি সেগুলি যাইহোক রাখার সিদ্ধান্ত নিয়েছি।
মুড়ু

5

অন্য একটি পদ্ধতি (সম্ভবত এর তাত্ত্বিক বিষয়বস্তুগুলির জন্য এর ব্যবহারিক প্রয়োগগুলির চেয়ে বেশি আকর্ষণীয়)।

ব্যবহারকারীর পাসওয়ার্ড সংরক্ষণ করা হয় /etc/shadow

এখানে সঞ্চিত পাসওয়ার্ডগুলি সর্বশেষতম উবুন্টু রিলিজ ব্যবহার করে এনক্রিপ্ট করা আছে SHA-512

বিশেষত, পাসওয়ার্ড তৈরির পরে, পরিষ্কার পাঠ্যে থাকা পাসওয়ার্ডটি সল্ট এবং এনক্রিপ্ট করা হয় SHA-512

তারপরে একটি সমাধান হ'ল প্রদত্ত পাসওয়ার্ডটি লবণ / এনক্রিপ্ট করা এবং প্রদত্ত ব্যবহারকারীর /etc/shadowপ্রবেশের মধ্যে থাকা এনক্রিপ্ট করা ব্যবহারকারীর পাসওয়ার্ডের সাথে মিলে যায় ।

প্রতিটি ব্যবহারকারীর /etc/shadowপ্রবেশে পাসওয়ার্ড কীভাবে সংরক্ষণ করা হয় তার দ্রুত ব্রেকডাউন দিতে , এখানে পাসওয়ার্ড সহ /etc/shadowকোনও ব্যবহারকারীর জন্য একটি নমুনা এন্ট্রি দেওয়া হল :foobar

foo:$6$lWS1oJnmDlaXrx1F$h4vuzZVBwIE1Z6vT7N.spwbxYig9e/OHOIH.VDv9JPaC3.OtTusPFzma7g.R/oSZFW5QOI7IDdDY01G0zTGQE/:16566:0:99999:7:::
  • foo: ব্যবহারকারীর নাম
  • 6: পাসওয়ার্ডের এনক্রিপশন প্রকার
  • lWS1oJnmDlaXrx1F: পাসওয়ার্ডের এনক্রিপশন লবণ
  • h4vuzZVBwIE1Z6vT7N.spwbxYig9e/OHOIH.VDv9JPaC3.OtTusPFzma7g.R/oSZFW5QOI7IDdDY01G0zTGQE/: SHA-512সল্টেড / এনক্রিপ্ট করা পাসওয়ার্ড

barপ্রদত্ত ব্যবহারকারীর জন্য প্রদত্ত পাসওয়ার্ডটি মেলানোর জন্য foo, প্রথমে করণীয়টি হল লবণ পাওয়া:

$ sudo getent shadow foo | cut -d$ -f3
lWS1oJnmDlaXrx1F

তারপরে একটিতে সম্পূর্ণ সল্টেড / এনক্রিপ্ট করা পাসওয়ার্ড পাওয়া উচিত:

$ sudo getent shadow foo | cut -d: -f2
$6$lWS1oJnmDlaXrx1F$h4vuzZVBwIE1Z6vT7N.spwbxYig9e/OHOIH.VDv9JPaC3.OtTusPFzma7g.R/oSZFW5QOI7IDdDY01G0zTGQE/

তারপরে প্রদত্ত পাসওয়ার্ডটি লবণাক্ত / এনক্রিপ্ট করা এবং এতে সল্টযুক্ত / এনক্রিপ্ট করা ব্যবহারকারীর পাসওয়ার্ডের সাথে মিলে যায় /etc/shadow:

$ python -c 'import crypt; print crypt.crypt("bar", "$6$lWS1oJnmDlaXrx1F")'
$6$lWS1oJnmDlaXrx1F$h4vuzZVBwIE1Z6vT7N.spwbxYig9e/OHOIH.VDv9JPaC3.OtTusPFzma7g.R/oSZFW5QOI7IDdDY01G0zTGQE/

তারা মিলছে! সমস্ত কিছুই একটি bashস্ক্রিপ্টে রাখা:

#!/bin/bash

read -p "Username >" username
IFS= read -p "Password >" password
salt=$(sudo getent shadow $username | cut -d$ -f3)
epassword=$(sudo getent shadow $username | cut -d: -f2)
match=$(python -c 'import crypt; print crypt.crypt("'"${password}"'", "$6$'${salt}'")')
[ ${match} == ${epassword} ] && echo "Password matches" || echo "Password doesn't match"

আউটপুট:

$ ./script.sh 
Username >foo
Password >bar
Password matches
$ ./script.sh 
Username >foo
Password >bar1
Password doesn't match

1
sudo getent shadow>> sudo grep ...। অন্যথায়, দুর্দান্ত। আমি এটিই মূলত ভেবেছিলাম, তখন খুব অলস হয়ে উঠলাম।
মুড়ু

@ মুরু ধন্যবাদ স্পষ্টভাবে সুন্দর মতানুযায়ী, তাই আপডেট, কিন্তু এখনও আমি নিশ্চিত নই যদি এই ক্ষেত্রে getent+ + grep+ + cut> grep+ +cut
কস

1
Eek। getentআপনার জন্য অনুসন্ধান করতে পারেন। আমি সম্পাদনার স্বাধীনতা গ্রহণ করেছি।
মুড়ু

@ মুরু হ্যাঁ আপনার আসলে হওয়া উচিত, এখন আমি বিষয়টি দেখতে পাচ্ছি!
কোস

2
আমি মনে করি এটি আসলে বেশ ব্যবহারিক, যদিও আমি পক্ষপাতদুষ্ট হতে পারি: এটি একই পদ্ধতি যা আমি ব্যবহার করেছি। আপনার বাস্তবায়ন এবং উপস্থাপনা যদিও একেবারেই আলাদা - এটি অবশ্যই একটি মূল্যবান উত্তর। যদিও আমি mkpasswdব্যবহারকারীর ইনপুট এবং বিদ্যমান লবণের (এবং অতিরিক্ত বৈশিষ্ট্য এবং ডায়াগনস্টিকস অন্তর্ভুক্ত) থেকে একটি হ্যাশ উত্পন্ন করতাম , আপনি পরিবর্তে একটি সাধারণ পাইথন প্রোগ্রামকে কোডিং করেছেন যা mkpasswdসবচেয়ে গুরুত্বপূর্ণ কার্যকারিতা বাস্তবায়ন করে। আমি আপনাকে IFS=পাসওয়ার্ড ইনপুট পড়ার সময় সেট করার পরামর্শ দিচ্ছি এবং এর ${password}সাথে উদ্ধৃতি দিচ্ছি ", যাতে হোয়াইটস্পেসের সাহায্যে পাসওয়ার্ড চেষ্টা করলে স্ক্রিপ্টটি ভেঙে যায় না।
এলিয়াহ কাগন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.