අවම වශයෙන් මගේ උබුන්ටු වල, “බොහෝ සමාන” පණිවිඩ එළියට එයි විට: "... අක්ෂරවලින් අඩකට වඩා වෙනස් ඒවා ...." (විස්තර සඳහා පහත බලන්න). @slhck පිළිතුරෙහි පැහැදිලිව විස්තර කර ඇති පරිදි PAM සහාය සඳහා ස්තූතියි.
PAM භාවිතා නොකරන වෙනත් වේදිකාවක් සඳහා, "බොහෝ සමාන" පණිවිඩ එන්නේ: "... අක්ෂරවලින් අඩකට වඩා වෙනස් ඒවා ...." (විස්තර සඳහා පහත බලන්න)
මෙම ප්රකාශය ඔබ විසින්ම තවදුරටත් පරීක්ෂා කර බැලීමට, ප්රභව කේතය පරීක්ෂා කළ හැකිය. මෙන්න කොහොමද.
"Passwd" වැඩසටහන passwd පැකේජයට ඇතුළත් කර ඇත:
verzulli@iMac:~$ which passwd
/usr/bin/passwd
verzulli@iMac:~$ dpkg -S /usr/bin/passwd
passwd: /usr/bin/passwd
අප විවෘත මූලාශ්ර තාක්ෂණයන් සමඟ කටයුතු කරන විට, අපට ප්රභව කේතයට අසීමිත ප්රවේශයක් ඇත. එය ලබා ගැනීම තරම් සරල ය:
verzulli@iMac:/usr/local/src/passwd$ apt-get source passwd
පසුව කේතයේ අදාළ කොටස සොයා ගැනීම පහසුය:
verzulli@iMac:/usr/local/src/passwd$ grep -i -r 'too similar' .
[...]
./shadow-4.1.5.1/NEWS:- new password is not "too similar" if it is long enough
./shadow-4.1.5.1/libmisc/obscure.c: msg = _("too similar");
"Obscure.c" වෙත ඉක්මන් පරීක්ෂණයක් මඟින් මෙය ලබා දෙයි (මම අදාළ කේත කැබැල්ල පමණක් කපා අලවන්නෙමි):
static const char *password_check (
const char *old,
const char *new,
const struct passwd *pwdp)
{
const char *msg = NULL;
char *oldmono, *newmono, *wrapped;
if (strcmp (new, old) == 0) {
return _("no change");
}
[...]
if (palindrome (oldmono, newmono)) {
msg = _("a palindrome");
} else if (strcmp (oldmono, newmono) == 0) {
msg = _("case changes only");
} else if (similar (oldmono, newmono)) {
msg = _("too similar");
} else if (simple (old, new)) {
msg = _("too simple");
} else if (strstr (wrapped, newmono) != NULL) {
msg = _("rotated");
} else {
}
[...]
return msg;
}
ඉතින්, දැන්, අපි දන්නවා පැරණි හා නව-එක් චෙක්පතක් මත පදනම් වූ "සමාන" ශ්රිතයක් දෙකම සමාන නම්. මෙන්න ස්නිපටය:
/*
* more than half of the characters are different ones.
*/
static bool similar (const char *old, const char *new)
{
int i, j;
/*
* XXX - sometimes this fails when changing from a simple password
* to a really long one (MD5). For now, I just return success if
* the new password is long enough. Please feel free to suggest
* something better... --marekm
*/
if (strlen (new) >= 8) {
return false;
}
for (i = j = 0; ('\0' != new[i]) && ('\0' != old[i]); i++) {
if (strchr (new, old[i]) != NULL) {
j++;
}
}
if (i >= j * 2) {
return false;
}
return true;
}
මම සී කේතය සමාලෝචනය කර නැත. ශ්රිත අර්ථ දැක්වීමට මොහොතකට පෙර අදහස් දැක්වීම විශ්වාස කිරීමට මා සීමා විය :-)
PAM සහ NON-PAM දැනුවත් වේදිකා අතර වෙනස අර්ථ දක්වා ඇත්තේ “obscure.c” ගොනුව තුළ ය.
#include <config.h>
#ifndef USE_PAM
[...lots of things, including all the above...]
#else /* !USE_PAM */
extern int errno; /* warning: ANSI C forbids an empty source file */
#endif /* !USE_PAM */