Рекомендации программисту веб-сервисов
Проверять пароли при регистрации на минимальную длину, присутствие символов разного регистра и цифр. Принуждать пользователя использовать знаки пунктуации и другие неалфавитные символы я не советую. Еще полезно проверять что слово не находится в словарях. Так что ключевые слова: длина, переменный регистр, цифры и по словарю. Проверять при регистрации, если она доступна online и при смене пароля пользователем.
Можно генерировать пароли и раздавать их пользователям. Некоторые вебсервисы так и поступают. Это избавляет пользователя от неудачных попыток придумать стойкий пароль. Регистрация может ускориться, а юзер сэкономит нервы, но зато получит пароль негодный для запоминания. Это не страшно если он пользуется парольным менеджером.
И все же посоветую оставить возможность смены пароля после выдачи автоматического, для тех кто очень хочет установить свой пароль. При этой смене пароль проверять как описано в первом абзаце. Вот возможный алгоритм проверки.
#!/usr/bin/perl
$tst = "pasSword3";
$MINPASSL = 9;
if (($tst ne uc($tst)) && ($tst ne lc($tst))
&& (length($tst) >= $MINPASSL) && ($tst =~ m/\d/))
{
print "good password";
} else {
print "bad password";
}
Возможная проверка на то что выбранный пользователем пароль не находится в словаре
#!/usr/bin/perl
$tst = "pasSword3";
$dictFname = 'passdict.txt'; # все пароли в словаре в нижнем регистре!
my(@dict);
my($word, $tstlc);
$found = 0;
open(FH, "<$dictFname") || die "can't find dictionary file $dictFname";
@dict = <FH>;
close(FH);
chomp(@dict);
$tstlc = lc($tst);
foreach $word (@dict)
{
if ($word eq $tstlc)
{
$found = 1;
last;
}
}
if ($found == 1)
{
print "bad password";
} else {
print "good password";
}
Perl удобен тем что ходит на всех платформах. Приведенные наброски легко адаптировать для работы как на CGI так и в консоли.
Кроме проверки на стойкость пароля, в веб-сервисах полезно вести лог неудачных попыток логона, а также устанавливать запрет на вход с определенного IP после 3-5 неудачных попыток на время в 10-15 секунд. Это стандартные защитные меры удаленных систем.
Почему я советую такое малое время задержки после неудачных логонов? Да просто забаненный IP может оказаться прокси-сервером. И кроме злоумышленника через этот прокси к вам могут пытаться залогиниться добропорядочные пользователи. Задержка здесь лишь снизит скорость подбора до неприемлемой. Ни один злоумышленник не станет подбирать пароль со скоростью 10-20 паролей в минуту.
Схема - как организовать свое стадо паролей
Мне кажется вполне логичной такая схема. Есть только несколько паролей в голове Каждый их них качественный. Придуман вручную, с учетом запоминаемости и быстрой набираемости. Это пароли к локальным к системам, парольному менеджеру, и может быть паре удаленных систем. Например к online-почтовику. Эти пароли также отмечены в парольном менеджере. Пароль к его базе сохранен где-нибудь еще. В банке, сейфе.
Все остальные пароли длинные, надежные и незапоминаемые. Все они хранятся в парольном менеджере. Почти все они - это пароли к интернетным сервисам - почтам, форумам, хостингам, сайтам.
Все пароли, включая те несколько, что в голове, периодически меняются. Эта схема работает у меня уже несколько лет, что на мой взгляд даже важнее ее логичности.