অন্তত আমার উবুন্টুতে, "খুব অনুরূপ" বার্তা প্রকাশিত হয়েছিল কখন: "... অর্ধেকেরও বেশি চরিত্রগুলি আলাদা আলাদা ...." (বিশদের জন্য নীচে দেখুন)। পিএএম সমর্থনের জন্য ধন্যবাদ, যেমনটি @ এসএলএইচসি উত্তরে স্পষ্টভাবে ব্যাখ্যা করা হয়েছে।
অন্যান্য প্ল্যাটফর্মের জন্য, যেখানে পিএএম ব্যবহার করা হয় না, "খুব অনুরূপ" বার্তা আসে যখন: "... অর্ধেকেরও বেশি চরিত্রগুলি আলাদা আলাদা ...." (বিশদগুলির জন্য নীচে দেখুন)
এই বিবৃতিটি আপনার নিজের থেকে আরও পরীক্ষা করতে, উত্স-কোডটি পরীক্ষা করা সম্ভব। এখানে কিভাবে।
"পাসডাব্লুড" প্রোগ্রামটি পাসডাব্লুড প্যাকেজে অন্তর্ভুক্ত রয়েছে:
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;
}
আমি সি কোড পর্যালোচনা করি নি। আমি ফাংশন সংজ্ঞার ঠিক আগে মন্তব্যে বিশ্বাসের মধ্যে নিজেকে সীমাবদ্ধ করেছি :-)
পিএএম এবং নন-প্যাম সচেতন প্ল্যাটফর্মগুলির মধ্যে পার্থক্যটি "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 */