Как я измеряю силу пароля?

На основе этот отчет об ошибках и это , ТАКИМ ОБРАЗОМ, вопрос, который я предполагаю, нет никакого поддерживаемого способа сделать этот банкомат.

РЕДАКТИРОВАНИЕ: Chris упомянул WiFinder, который предложил мне делать немного больше рытья. По словам автора WiFinder блог он использовал методы от частного Apple80211.framework. (Платформа, упомянутая в вышеупомянутом, связанном ТАК вопрос.), По-видимому, Apple больше не будет позволять эти частные вызовы API в приложениях, который препятствует тому, чтобы он обновил WiFinder.

, Но, если Вы хотите использовать их так или иначе, некоторые добрые люди отправили список обнаруженных функций Apple80211 к код Google .

Это похоже Apple80211GetInfoCopy , мог бы добиться цели.

8
задан OrangeRind 8 April 2011 в 14:02
поделиться

5 ответов

Это превратилось в мою общую мозговую свалку лучших практик работы с паролями в PHP / MySQL. Представленные здесь идеи, как правило, не мои собственные, но лучшее из того, что я нашел на сегодняшний день.


Убедитесь, что вы используете SSL для всех операций с пользовательской информацией. Все страницы, которые включают эти формы, должны проверять, что они вызываются через HTTPS, и в противном случае отказываться работать.

Вы можете устранить большинство атак, просто ограничив количество разрешенных неудачных попыток входа в систему.

Разрешите использование относительно слабых паролей, но сохраните количество неудачных попыток входа в систему для каждого пользователя и потребуйте проверки пароля или пароля по электронной почте, если вы его превысите. Я установил максимальное количество сбоев равным 5.

Необходимо тщательно продумать представление пользователю сбоев входа в систему, чтобы не предоставлять информацию злоумышленникам. Неудачный вход из-за несуществующего пользователя должен возвращать то же сообщение, что и неудачный вход из-за неверного пароля. Предоставление другого сообщения позволит злоумышленникам определить допустимые входы пользователей.

Также убедитесь, что вы возвращаете точно такое же сообщение в случае сбоя слишком большого количества входов с действующим паролем и сбоя со слишком большим количеством входов в систему и неверным пароль. Предоставление другого сообщения позволит злоумышленникам определить действительные пароли пользователей. Изрядное количество пользователей, вынужденных сбросить свой пароль, просто вернет его к прежнему состоянию.

К сожалению, ограничение количества входов в систему на один IP-адрес нецелесообразно. Некоторые провайдеры, такие как AOL, и большинство компаний прокси-сервером свои веб-запросы. Установление этого лимита эффективно устранит этих пользователей.


Я обнаружил, что проверка слов словаря перед отправкой является неэффективной, так как вам нужно либо отправить словарь клиенту в javascript, либо отправить запрос ajax для каждого изменения поля. Я делал это какое-то время, и это работало нормально, но мне не нравился генерируемый им трафик.

Проверка на наличие слабых паролей без словарных слов ЯВЛЯЕТСЯ практичной клиентской стороной с помощью простого javascript.

После отправки я проверяю словарные слова и имя пользователя, содержащее пароль, и наоборот на стороне сервера. Легко загружаются очень хорошие словари, и их легко проверить. Одна из проблем заключается в том, что для проверки словарного слова вам нужно отправить запрос к базе данных, которая снова содержит пароль. Я решил заранее зашифровать свой словарь с помощью простого шифрования и SALT с конечной точкой, а затем проверить зашифрованный пароль. Не идеально, но лучше, чем обычный текст, и только по проводам для людей на ваших физических машинах и в подсети.

Когда вы будете довольны паролем, который они выбрали, сначала зашифруйте его с помощью PHP, а затем сохраните. Следующая функция шифрования паролей тоже не является моей идеей, но решает ряд проблем. Шифрование в PHP не позволяет людям на общем сервере перехватить ваши незашифрованные пароли. Добавление чего-то для каждого пользователя, которое не изменится (я использую электронную почту, поскольку это имя пользователя для моих сайтов), и добавление хеша (SALT - это короткая постоянная строка, которую я изменяю для каждого сайта), повышает устойчивость к атакам. Поскольку SALT находится внутри пароля, а пароль может быть любой длины, становится практически невозможно атаковать это с помощью радужной таблицы. t change (я использую электронную почту, так как это имя пользователя для моих сайтов) и добавление хеша (SALT - это короткая постоянная строка, которую я изменяю для каждого сайта) повышает устойчивость к атакам. Поскольку SALT находится внутри пароля, а пароль может быть любой длины, становится практически невозможно атаковать это с помощью радужной таблицы. t change (я использую электронную почту, так как это имя пользователя для моих сайтов) и добавление хеша (SALT - это короткая постоянная строка, которую я изменяю для каждого сайта) повышает устойчивость к атакам. Поскольку SALT находится внутри пароля, а пароль может быть любой длины, становится практически невозможно атаковать это с помощью радужной таблицы. С другой стороны, это также означает, что люди не могут изменить свой адрес электронной почты, и вы не можете изменить SALT, не аннулируя пароль каждого.

РЕДАКТИРОВАТЬ: Теперь я бы рекомендовал использовать PhPass вместо моей собственной функции. здесь, или просто забудьте о входе пользователя в систему и используйте вместо него OpenID .

function password_crypt($email,$toHash) {
  $password = str_split($toHash,(strlen($toHash)/2)+1);
  return hash('sha256', $email.$password[0].SALT.$password[1]); 
}

Мой счетчик паролей на стороне клиента Jqueryish. Целью должно быть div. Его ширина изменится от 0 до 100, а цвет фона изменится в зависимости от классов, обозначенных в скрипте. Опять же, в основном украденные из других вещей, которые я нашел:

$.updatePasswordMeter = function(password,username,target) {
$.updatePasswordMeter._checkRepetition = function(pLen,str) {
res = ""
for ( i=0; i<str.length ; i++ ) {
    repeated=true;
    for (j=0;j < pLen && (j+i+pLen) < str.length;j++)
        repeated=repeated && (str.charAt(j+i)==str.charAt(j+i+pLen));
    if (j<pLen) repeated=false;
    if (repeated) {
        i+=pLen-1;
        repeated=false;
    }
    else {
        res+=str.charAt(i);
    };
};
return res;
};
var score = 0;
var r_class = 'weak-password';
//password < 4
if (password.length < 4 || password.toLowerCase()==username.toLowerCase()) { 
target.width(score + '%').removeClass("weak-password okay-password good-password strong-password"
).addClass(r_class);
  return true;
} 
//password length
score += password.length * 4;
score += ( $.updatePasswordMeter._checkRepetition(1,password).length - password.length ) * 1;
score += ( $.updatePasswordMeter._checkRepetition(2,password).length - password.length ) * 1;
score += ( $.updatePasswordMeter._checkRepetition(3,password).length - password.length ) * 1;
score += ( $.updatePasswordMeter._checkRepetition(4,password).length - password.length ) * 1;
//password has 3 numbers
if (password.match(/(.*[0-9].*[0-9].*[0-9])/))  score += 5; 

//password has 2 symbols
if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) score += 5; 

//password has Upper and Lower chars
if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/))  score += 10; 

//password has number and chars
if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/))  score += 15; 
//
//password has number and symbol
if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/))  score += 15; 

//password has char and symbol
if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/))  score += 15; 

//password is just a nubers or chars
if (password.match(/^\w+$/) || password.match(/^\d+$/) )  score -= 10; 

//verifing 0 < score < 100
score = score * 2;
if ( score < 0 )  score = 0;
if ( score > 100 )  score = 100;
if (score > 25 ) r_class = 'okay-password';
if (score > 50  ) r_class = 'good-password';
if (score > 75 ) r_class = 'strong-password';
target.width(score + '%').removeClass("weak-password okay-password good-password strong-password"
).addClass(r_class);
return true;
};
19
ответ дан 5 December 2019 в 05:26
поделиться

По сути, вы хотите предотвратить основные типы атак

  • Атаки по словарю
  • Атаки методом грубой силы

Чтобы предотвратить первые, вы хотите считать пароли, содержащие общие слова, слабыми. Чтобы предотвратить второе, вы хотите поощрять пароли разумной длины (обычно более 8 символов) и с достаточно большим набором символов (включая буквы, цифры и специальные символы). Если вы считаете, что строчные и прописные буквы различны, это существенно увеличивает набор символов. Однако это создает проблему удобства использования для некоторых сообществ пользователей, поэтому вам необходимо сбалансировать это соображение.

Быстрый поиск в Google обнаружил решения, которые учитывают атаки грубой силы (сложный пароль), но не атаки по словарю. PHP Password Strength Meter из этот список проверок надежности запускает проверку на стороне сервера, поэтому его можно расширить для проверки словаря.

РЕДАКТИРОВАТЬ:

Кстати ... вам также следует ограничить количество попыток входа на пользователя. Это снизит вероятность обоих типов атак. Эффективно, но не удобно для пользователя, заблокировать учетную запись после X неудачных попыток и потребовать сброса пароля. Более удобный для пользователя, но требует больше усилий для уменьшения времени между попытками входа в систему. Вы также можете потребовать CAPTCHA после первых нескольких попыток входа в систему (что требуется для Stack Overflow после слишком большого количества изменений или для очень новых пользователей).

Это снизит вероятность обоих типов атак. Эффективно, но не удобно для пользователя, заблокировать учетную запись после X неудачных попыток и потребовать сброса пароля. Более удобный для пользователя, но требует больше усилий для уменьшения времени между попытками входа в систему. Вы также можете потребовать CAPTCHA после первых нескольких попыток входа в систему (что требуется для Stack Overflow после слишком большого количества изменений или для очень новых пользователей).

Это снизит вероятность обоих типов атак. Эффективно, но не удобно для пользователя, заблокировать учетную запись после X неудачных попыток и потребовать сброса пароля. Более удобный, но требует больше усилий для уменьшения времени между попытками входа в систему. Вы также можете потребовать CAPTCHA после первых нескольких попыток входа в систему (что требуется для Stack Overflow после слишком большого количества изменений или для очень новых пользователей).

7
ответ дан 5 December 2019 в 05:26
поделиться

В основном вы, вероятно, захотите использовать регулярные выражения для проверки длины и сложности пароля.

Хороший пример выполнения этого с использованием javascript можно найти здесь:

http: // marketingtechblog.com/programming/javascript-password-strength/

3
ответ дан 5 December 2019 в 05:26
поделиться

Я не могу придумать конкретный алгоритм для проверки надежности пароля. Что мы делаем, так это определяем несколько критериев, и когда пароль соответствует критериям, мы добавляем 1 к его оценке. Когда пароль достигает порогового значения, пароль является надежным. В противном случае он слабый.

Вы можете определить много разных уровней силы, если с разными задержками, или вы можете определить разные значения для определенных критериев. Например, если пароль состоит из 5 символов, мы добавляем 1, но если он получил 10, мы добавляем 2.

вот список критериев для проверки длины

(от 8 до 12 - нормально, больше - лучше) Содержит строчные буквы Содержит прописные буквы Заглавная буква НЕ является первой. Содержит номер Содержит символы последний символ НЕ является человеческим символом (например:. или!) Не похоже на словарное слово. Некоторые мудрые взломы паролей содержат библиотеку замен слов и букв (например, Библиотека -> L1br @ ry )

Надеюсь, что это поможет.

0
ответ дан 5 December 2019 в 05:26
поделиться

Как указал Дарен Швенке, вам лучше поработать над безопасностью самостоятельно, а не отдавать ее в руки пользователя .

Но полезно дать пользователю несколько подсказок о том, насколько надежен его пароль, потому что лучший способ получить пароль по-прежнему - это социальная деятельность .

Таким образом, вы можете взломать небольшой клиентский скрипт, который проверяет надежность пароля пользователя в качестве индикатора вежливости в реальном времени. Он ничего не блокирует, но дает ему хорошее теплое ощущение, когда становится зеленым: -)

В основном вы должны проверять общий смысл: проверьте, содержит ли пароль буквы, цифры и небуквенные символы в разумном количестве.

Вы можете очень легко взломать свой собственный алгоритм: просто сделайте отметку 10/10:

  • 0 - пароль нулевой длины;
  • +2 за каждые 8 ​​знаков в пароле (15 считается безопасной длиной);
  • +1 за использование буквы, +2 за использование 2 букв;
  • +1 за использование числа, +2 для использования 2 цифр;
  • +1 для использования не алфавитных знаков, +2 для 2.

Вам не нужно проверять божественные пароли (есть ли заглавные буквы, где расположены специальные символы и т. д.), ваши пользователи не работают в банке / армии / секретной службе / месячной индустрии фильмов о питоне, не так ли?

Вы можете закодировать это за час, не обладая сумасшедшими навыками JavaScript.

В любом случае подтвердите пароль и перенесите весь код безопасности на сервер. Еще лучше, если вы можете делегировать аутентификацию (например, открытый идентификатор).

  • +1 для использования числа, +2 для использования 2 чисел;
  • +1 для использования неалфавитных знаков, +2 для 2.
  • Вам не нужно проверять для божественных паролей (есть ли заглавные буквы, где расположены специальные символы и т. д.), ваши пользователи не работают в банке / армии / секретной службе / месячной индустрии фильмов о питоне, не так ли?

    Вы можете закодировать это за час без сумасшедших навыков работы с javascript.

    И в любом случае подтвердите пароль и переместите весь код безопасности на сервер. Еще лучше, если вы можете делегировать аутентификацию (например, открытый идентификатор).

  • +1 для использования числа, +2 для использования 2 чисел;
  • +1 для использования не алфавитных знаков, +2 для 2.
  • Вам не нужно проверять для божественных паролей (есть ли заглавные буквы, где расположены специальные символы и т. д.), ваши пользователи не работают в банке / армии / секретной службе / месячной индустрии фильмов о питоне, не так ли?

    Вы можете закодировать это за час без сумасшедших навыков работы с javascript.

    В любом случае, подтвердите пароль и переместите весь код безопасности на сервер. Еще лучше, если вы можете делегировать аутентификацию (например, открытый идентификатор).

    ваши пользователи не работают в банках / вооруженных силах / секретных службах / ежемесячных фильмах о питоне, не так ли?

    Вы можете закодировать это за час, не обладая сумасшедшими навыками работы с javascript.

    В любом случае, подтвердите пароль и переместите все код безопасности на стороне сервера. Еще лучше, если вы можете делегировать аутентификацию (например, открытый идентификатор).

    ваши пользователи не работают в банках / вооруженных силах / секретных службах / ежемесячных фильмах о питоне, не так ли?

    Вы можете закодировать это за час, не обладая сумасшедшими навыками работы с javascript.

    В любом случае, подтвердите пароль и переместите все код безопасности на стороне сервера. Еще лучше, если вы можете делегировать аутентификацию (например, открытый идентификатор).

    2
    ответ дан 5 December 2019 в 05:26
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: