Setidaknya di Ubuntu saya, pesan "terlalu mirip" muncul ketika: "... lebih dari separuh karakter adalah yang berbeda ...." (lihat detail di bawah). terima kasih atas dukungan PAM, sebagaimana dijelaskan dengan jelas dalam jawaban @slhck.
Untuk platform lain, di mana PAM tidak digunakan, pesan "terlalu mirip" keluar ketika: "... lebih dari separuh karakter adalah yang berbeda ...." (lihat detail di bawah)
Untuk lebih lanjut memeriksa pernyataan ini sendiri, dimungkinkan untuk memeriksa kode sumber. Begini caranya.
Program "passwd" termasuk dalam paket passwd:
verzulli@iMac:~$ which passwd
/usr/bin/passwd
verzulli@iMac:~$ dpkg -S /usr/bin/passwd
passwd: /usr/bin/passwd
Saat kita berhadapan dengan teknologi Open Source, kita memiliki akses tidak terbatas ke kode sumber. Mendapatkannya sesederhana:
verzulli@iMac:/usr/local/src/passwd$ apt-get source passwd
Setelah itu mudah untuk menemukan bagian kode yang relevan:
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");
Pemeriksaan cepat ke "obscure.c" memberikan ini (saya hanya memotong dan menempelkan potongan kode yang relevan):
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;
}
Jadi, sekarang, kita tahu bahwa ada fungsi "mirip" yang didasarkan pada yang lama dan yang baru memeriksa apakah keduanya mirip. Berikut cuplikannya:
/*
* 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;
}
Saya belum meninjau kode C. Saya membatasi diri dalam mempercayai komentar sebelum definisi fungsi :-)
Perbedaan antara platform yang sadar PAM dan NON-PAM didefinisikan dalam file "obscure.c" yang terstruktur seperti:
#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 */