password_format может быть:plaintext - passwords are stored in plaintext format - this is default
crypt - passwords are stored as modular crypt hashes (md5 or blowfish crypt)
crypt_trad - passwords are stored as des crypt hashes (2 character salt crypt)
salt = get_salt("зашифрованный пароль из базы",password_format);
// эта функция по сути возвращает первые 2, 16 или 17 символов зашифрованного пароля в качестве salt
// получаем salt из уже сохраненного пароля:
get_salt (src,format) {
int num; /* how many characters is salt long? */
switch (format) {
case PASSWORD_FORMAT_CRYPT:
/* md5 crypt */
if (src[1] == '1')
num = 12;
/* blowfish crypt */
else if (src[1] == '2')
num = (src[1] == '2' && src[2] == 'a') ? 17 : 16;
/* traditional crypt */
else
num = 2;
break;
case PASSWORD_FORMAT_CRYPTTRAD:
num = 2;
break;
default:
return 1; }
return strncpy(dest, src, num);
//
// Здесь мы сравниваем зашифрованную версию полученного открытого пароля и зашифрованную версию из базы
// что бы они были равны мы должны использовать одинаковый пароль и одинаковый salt, но salt мы вычисляем от ранее
// зашифрованного пароля, как видно выше!!! закалдованный круг...
if (crypt(clear_passwd, salt) == "зашифрованный пароль из базы"))
return SASL_OK;
else
ret = SASL_BADAUTH;