আপনি খুব সহজেই এনএসপি সহ এনক্রিপ্ট হওয়া পাসওয়ার্ডটি বের করতে পারেন। এরপরে আপনাকে উপসর্গটি বের করতে হবে $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় পন্থা।