आप आसानी से awk के साथ एन्क्रिप्टेड पासवर्ड निकाल सकते हैं। फिर आपको उपसर्ग निकालने की जरूरत है $algorithm$salt$
(यह मानते हुए कि यह प्रणाली पारंपरिक डीईएस का उपयोग नहीं कर रही है, जो कि दृढ़ता से पदावनत है क्योंकि यह इन दिनों क्रूर-मजबूर हो सकता है)।
correct=$(</etc/shadow awk -v user=bob -F : 'user == $1 {print $2}')
prefix=${correct%"${correct#\$*\$*\$}"}
पासवर्ड जाँच के लिए, अंतर्निहित C फ़ंक्शन है 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
व्यस्त बॉक्स में होने के बावजूद, इसे अक्सर छोड़ दिया जाता है क्योंकि इसके कई उपयोगों के लिए सेट रूट के लिए व्यस्त बॉक्स की आवश्यकता होती है। फिर भी, यदि आप ऐसा कर सकते हैं, तो सुरक्षा के दृष्टिकोण से यह सबसे मजबूत दृष्टिकोण है।