লিনাক্স দিয়ে পাসওয়ার্ড চেক কিভাবে?


22

আমি লিনাক্স কমান্ড লাইন থেকে পরীক্ষা করতে চাই, যদি প্রদত্ত ক্লিয়ারটেক্সট পাসওয়ার্ড / / ইত্যাদি / ছায়ায় থাকা কোনও ক্রিপ্টযুক্ত পাসওয়ার্ডের সমান হয়

(ওয়েব ব্যবহারকারীদের প্রমাণীকরণের জন্য আমার এটি দরকার I'm আমি একটি এমবেডড লিনাক্স চালাচ্ছি))

আমার নিজের / etc / ছায়া ফাইলটিতে অ্যাক্সেস রয়েছে।


পাসওয়ার্ড দিয়ে ব্যবহারকারী হিসাবে লগ ইন?
কুসালানন্দ

পরীক্ষাটি অবশ্যই স্বয়ংক্রিয়ভাবে করা উচিত, আমি ওয়েব সার্ভার থেকে ম্যানুয়ালি পাসওয়ার্ড টাইপ করতে পারি না
michelemarcon

উত্তর:


17

আপনি খুব সহজেই এনএসপি সহ এনক্রিপ্ট হওয়া পাসওয়ার্ডটি বের করতে পারেন। এরপরে আপনাকে উপসর্গটি বের করতে হবে $algorithm$salt$(ধরে নিবেন যে এই সিস্টেমটি theতিহ্যবাহী ডিইএস ব্যবহার করছে না, যা দৃre়ভাবে অবমূল্যায়ন করা হয়েছে কারণ এই দিনগুলিতে এটি নৃশংস হতে পারে)।

correct=$(</etc/shadow awk -v user=bob -F : 'user == $1 {print $2}')
prefix=${correct%"${correct#\$*\$*\$}"}

পাসওয়ার্ড যাচাইয়ের জন্য, অন্তর্নিহিত সি ফাংশনটি রয়েছে cryptতবে এটি অ্যাক্সেস করার জন্য কোনও আদর্শ শেল কমান্ড নেই।

কমান্ড লাইনে, আপনি cryptপাসওয়ার্ডটি চাওয়ার জন্য পার্ল ওয়ান-লাইনার ব্যবহার করতে পারেন ।

supplied=$(echo "$password" |
           perl -e '$_ = <STDIN>; chomp; print crypt($_, $ARGV[0])' "$prefix")
if [ "$supplied" = "$correct" ]; then 

যেহেতু খাঁটি শেল সরঞ্জামগুলিতে এটি করা যায় না, যদি আপনার কাছে পার্ল উপলব্ধ থাকে তবে আপনি পার্লের মধ্যে এটিও করতে পারেন। (বা পাইথন, রুবি, আপনার কাছে যা কিছু আছে যা cryptফাংশনটিকে কল করতে পারে)) সতর্কতা, অনির্ধারিত কোড।

#!/usr/bin/env perl
use warnings;
use strict;
my @pwent = getpwnam($ARGV[0]);
if (!@pwent) {die "Invalid username: $ARGV[0]\n";}
my $supplied = <STDIN>;
chomp($supplied);
if (crypt($supplied, $pwent[1]) eq $pwent[1]) {
    exit(0);
} else {
    print STDERR "Invalid password for $ARGV[0]\n";
    exit(1);
}

পার্ল ব্যতীত এম্বেড করা সিস্টেমে আমি একটি ছোট, ডেডিকেটেড সি প্রোগ্রাম ব্যবহার করব। সতর্কতা, সরাসরি ব্রাউজারে টাইপ করা, আমি এমনকি সংকলনের চেষ্টাও করি নি। এটি জোরালো বাস্তবায়ন হিসাবে নয়, প্রয়োজনীয় পদক্ষেপগুলি বর্ণনা করার জন্য!

/* Usage: echo password | check_password username */
#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>
#include <shadow.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
    char password[100];
    struct spwd shadow_entry;
    char *p, *correct, *supplied, *salt;
    if (argc < 2) return 2;
    /* Read the password from stdin */
    p = fgets(password, sizeof(password), stdin);
    if (p == NULL) return 2;
    *p = 0;
    /* Read the correct hash from the shadow entry */
    shadow_entry = getspnam(username);
    if (shadow_entry == NULL) return 1;
    correct = shadow_entry->sp_pwdp;
    /* Extract the salt. Remember to free the memory. */
    salt = strdup(correct);
    if (salt == NULL) return 2;
    p = strchr(salt + 1, '$');
    if (p == NULL) return 2;
    p = strchr(p + 1, '$');
    if (p == NULL) return 2;
    p[1] = 0;
    /*Encrypt the supplied password with the salt and compare the results*/
    supplied = crypt(password, salt);
    if (supplied == NULL) return 2;
    return !!strcmp(supplied, correct);
}

একটি বিদ্যমান পন্থা একটি বিদ্যমান প্রোগ্রাম যেমন suবা হিসাবে ব্যবহার করা হয় login। বস্তুত, যদি আপনি করতে পারেন, এটা ওয়েব অ্যাপ্লিকেশন যাহা এটা মাধ্যমে দরকার সম্পাদন করতে ব্যবস্থা আদর্শ হতে হবে su -c somecommand username। এখানে অসুবিধাটি হল পাসওয়ার্ডটি খাওয়ানো su; এটি একটি টার্মিনাল প্রয়োজন। একটি টার্মিনাল অনুকরণ করার সাধারণ সরঞ্জামটি আশা করা যায় তবে এটি এম্বেড থাকা সিস্টেমের জন্য একটি বড় নির্ভরতা। এছাড়াও suব্যাসিবক্সে থাকাকালীন , এটি প্রায়শই বাদ দেওয়া হয় কারণ এর বেশিরভাগ ব্যবহারে ব্যাসিবক্স বাইনারিটি নির্ধারিত রুট হওয়া প্রয়োজন। তবুও, আপনি যদি এটি করতে পারেন তবে এটি কোনও সুরক্ষার দৃষ্টিকোণ থেকে সর্বাধিক দৃ approach় পন্থা।


1
আমি suপদ্ধতির পছন্দ।
বেনজাহান

6

দেখুন man 5 shadowএবং man 3 crypt। পরবর্তী থেকে আপনি জানতে পারবেন যে পাসওয়ার্ডের হ্যাশগুলিতে /etc/shadowনিম্নলিখিত ফর্মটি রয়েছে:

 $id$salt$encrypted

যেখানে idএনক্রিপশনের ধরণ নির্ধারণ করে এবং আরও পড়া, এর মধ্যে একটি হতে পারে

          ID  | Method
          ---------------------------------------------------------
          1   | MD5
          2a  | Blowfish (not in mainline glibc; added in some
              | Linux distributions)
          5   | SHA-256 (since glibc 2.7)
          6   | SHA-512 (since glibc 2.7)

হ্যাশের ধরণের উপর নির্ভর করে আপনাকে "হাত দ্বারা" পাসওয়ার্ড তৈরি এবং যাচাই করার জন্য উপযুক্ত ফাংশন / সরঞ্জাম ব্যবহার করতে হবে। যদি সিস্টেমে mkpasswdপ্রোগ্রাম থাকে তবে আপনি এটি এখানে প্রস্তাবিত হিসাবে ব্যবহার করতে পারেন । (আপনি ছায়া ফাইল থেকে লবণ গ্রহণ করুন, যদি এটি সুস্পষ্ট না ছিল।) উদাহরণস্বরূপ, md5পাসওয়ার্ড সহ:

 mkpasswd -5 <the_salt> <the_password>

/etc/shadowপ্রবেশের সাথে মেলে এমন স্ট্রিং তৈরি করবে ।


1
আমার ডেবিয়ান হুইজিতে আমার কাছে কমান্ডটির সম্পূর্ণ ভিন্ন বাক্য গঠন mkpasswdছিল যা আমাকে ব্যবহার করে ইনস্টল করতে হয়েছিল apt-get install whois। ছায়া লাইনের জন্য কমান্ড লাইনটি <user>:$6$<salt>$<pwd>:ছিলmkpasswd -msha-512 <password> <salt>
ড্যানিয়েল অ্যাল্ডার

1

স্ট্যাক ওভারফ্লোতে অনুরূপ একটি প্রশ্ন জিজ্ঞাসা করা হয়েছিলক্লিলেসকোডার প্রত্যাশা ব্যবহার করে একটি স্ক্রিপ্ট সরবরাহ করেছিল যা আপনার এমবেডড সিস্টেমে আপনার থাকতে পারে বা নাও থাকতে পারে।

#!/bin/bash
#
# login.sh $USERNAME $PASSWORD

#this script doesn't work if it is run as root, since then we don't have to specify a pw for 'su'
if [ $(id -u) -eq 0 ]; then
        echo "This script can't be run as root." 1>&2
        exit 1
fi

if [ ! $# -eq 2 ]; then
        echo "Wrong Number of Arguments (expected 2, got $#)" 1>&2
        exit 1
fi

USERNAME=$1
PASSWORD=$2

#since we use expect inside a bash-script, we have to escape tcl-$.
expect << EOF
spawn su $USERNAME -c "exit" 
expect "Password:"
send "$PASSWORD\r"
#expect eof

set wait_result  [wait]

# check if it is an OS error or a return code from our command
#   index 2 should be -1 for OS erro, 0 for command return code
if {[lindex \$wait_result 2] == 0} {
        exit [lindex \$wait_result 3]
} 
else {
        exit 1 
}
EOF

0

মনে রাখবেন যে, সিস্টেমটি সঠিকভাবে কনফিগার করা হয়েছে তা ধরে নিয়ে, প্রোগ্রামটি মূল হিসাবে চালানো দরকার।

ছায়া ফাইলটি সরাসরি পড়া এবং ক্রিপ্টের চারপাশে আপনার নিজের কোড লেখার চেয়ে আরও ভাল সমাধান হ'ল প্যাম বাইন্ডিংগুলি ব্যবহার করা।

স্কুইড আর্গুমেন্ট ব্যবহার করে মানিয়ে এত সহজ - - tarball রূপে stdio যাচাই করে নিশ্চিত ব্যবহারকারী নাম / পাসওয়ার্ডের জন্য একটি সহজ CLI টুল দিয়ে আসতেন যদিও সংস্করণ আমি গভীর ক্ষত পূর্বে কমই গঠিত প্রোগ্রামিং জন্য একটি পিন-আপ পোস্টার ছিল। একটি দ্রুত গুগল এবং দেখে মনে হচ্ছে যে আরও সাম্প্রতিক সংস্করণগুলি উল্লেখযোগ্যভাবে পরিষ্কার হয়ে গেছে তবে এখনও সেখানে কয়েকটি আছে।


0
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


passwordHash () {
    password=${1}
    salt=${2}
    encryption=${3}

    hashes=$(echo ${password} | openssl passwd -${encryption} -salt ${salt} -stdin)
    echo $(substring ${hashes} "$" "3")
}


passwordIsValid () {
    user=${1}
    password=${2}

    encryption=$(secret "encryption" ${user})
    salt=$(secret "salt" ${user})
    salted=$(secret "salted" ${user})
    hash=$(passwordHash ${password} ${salt} ${encryption})

    [ ${salted} = ${hash} ] && echo "true" || echo "false"
}


secret () {
    secret=${1}
    user=${2}
    shadow=$(shadow ${user})

    if [ ${secret} = "encryption" ]; then
        position=1
    elif [ ${secret} = "salt" ]; then
        position=2
    elif [ ${secret} = "salted" ]; then
        position=3
    fi

    echo $(substring ${shadow} "$" ${position})
}


shadow () {
    user=${1}
    shadow=$(cat /etc/shadow | grep ${user})
    shadow=$(substring ${shadow} ":" "1")
    echo ${shadow}
}


substring () {
    string=${1}
    separator=${2}
    position=${3}

    substring=${string//"${separator}"/$'\2'}
    IFS=$'\2' read -a substring <<< "${substring}"
    echo ${substring[${position}]}
}


passwordIsValid ${@}

একটি ত্রুটি line 61: :: syntax error: operand expected (error token is ":")
ঘটায়

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