Можно ли показывать пользователям, почему их пароль не разрешен?


32

/////////////////////////////// Обновлено сообщение ниже //////////// ////////////////

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

Моя обновлена ​​функция проверки:

public function is_password( $str){ 
   if (strlen($ str) < 10) { // Less then 10 
    $this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.'); 
   return FALSE; 
   }elseif (strlen($ str) > 100) { // Greater then 100 
    $this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.'); 
   return FALSE; 
   }elseif (!preg_match("#[0-9]+#",$ str)) { // At least 1 number 
    $this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.'); 
   return FALSE; 
   }elseif (!preg_match("#[a-z]+#",$ str)) { // At least 1 letter 
    $this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.'); 
   return FALSE; 
   }elseif (!preg_match("#[A-Z]+#",$ str)) { // At least 1 capital 
    $this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.'); 
   return FALSE; 
   }elseif (!preg_match("#\W+#",$ str)) { // At least 1 symbol 
    $this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.'); 
   return FALSE; 
   }else{ 
   return TRUE; // No errors 
   } 
  }

Каждый раз, когда он возвращается FALSE, я всегда говорю им всю потребность пароль.

Просто, чтобы ответить на некоторые вопросы о том, почему он так долго:

Почему не так долго? Люди на моей работе, на которых я говорю, чтобы использовать предложения. Очень длинные в этом.

Как я использую свои пароли?/Зачем использовать 100 символов? -> просто используйте лучший алгоритм хеширования

Для PHP я использую лучшее, что есть для этого языка. I am using this library, который является эквивалентом PHP 5.5 new password hashing API, созданным Anthony Ferrara.. Мое рассуждение об использовании этого хеширования - это простой и очень высокий спрос на CPU (если вы когда-либо тестировали его на Linux/Windows, то использование ЦП на 100%). Кроме того, алгоритм очень масштабируемый из-за фактора затрат, тем выше стоимость, более изнурительная задача для CPU, чтобы зарегистрировать человека. Последнее I «Протестировано», я ставлю стоимость на 24. Прошел целый час для меня, чтобы попытаться войти и я получил ошибку времени PHP, прежде чем я даже прошел мимо экрана входа (это был глупый фактор стоимости). Исследование, проведенное Jeremi Gosney(ЭТО ЗАПИСЬ PDF ОТЧЕТА), который проверял силу этой функции по сравнению с другими более популярными (да, более популярными), пришел к выводу, что даже при использовании 25-GPU при использовании bcrypt при стоимости из 5, хеширование пароля является последним из ваших проблем. Я использую стоимость 17 ...

Моя функция если кто-то заинтересован (Части, которые имеют отношение к этому вопросу, по крайней мере):

public function create_user($ value) { 
   $this -> CI = get_instance();$ this -> CI -> load -> library('bcrypt'); 

   foreach ( $value as$ k => $v){// add PDO place holder to the keys$ vals[": $k"] =$ v; 
   } 
   $vals[":password"] =$ this -> CI -> bcrypt -> password_hash( $vals[":password"], PASSWORD_BCRYPT, array("cost" => 17)); // Take old$ vals[":password"] and run it through bcrypt to come up with the new $vals[":password"] 

Надеюсь, этот вопрос поможет другим там.

/////////////////////////////// Оригинальная публикация ниже ////////// //////////////////

В настоящее время я работаю над новым проектом, и проблема поразила меня.

Безопасно ли раскрывать ваши требования к паролю? Если да, то почему это безопасно?

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

Вот моя функция:

public function is_password($ str) { 
  if (strlen( $str) < 10){$ this -> set_message('is_password', 'Password too short.'); 
   return FALSE; 
  } elseif (strlen( $str) > 100){$ this -> set_message('is_password', 'Password is too long.'); 
   return FALSE; 
  } elseif (!preg_match("#[0-9]+#", $str)){$ this -> set_message('is_password', 'Password must include at least one number.'); 
   return FALSE; 
  } elseif (!preg_match("#[a-z]+#", $str)){$ this -> set_message('is_password', 'Password must contain at least one letter.'); 
   return FALSE; 
  } elseif (!preg_match("#[A-Z]+#", $str)){$ this -> set_message('is_password', 'Password must contain at least one capital letter.'); 
   return FALSE; 
  } elseif (!preg_match("#\W+#", $pwd)){$ this -> set_message('is_password', 'Password must include at least one symbol.'); 
   return FALSE; 
  } else { 
   return TRUE; 
  } 
} 

Моя мысль на это, если мы позволяем «пользователь»/злоумышленник знает, что мои пароли состоят из не было бы легче атакующему знать? Я знаю, что безопасность через неясность - не лучшая практика, но может ли это быть сильным аргументом в этой ситуации?

Хотелось бы узнать, правильно ли я это сделаю. Любая помощь будет большой.

+29

Лично мне не нравятся такие правила. Я бы предпочел оценить сложность пароля. Даже глупые оценки лучше, чем такие досадные правила. 13 авг. 132013-08-13 18:33:38

+81

Возможно, вы захотите пересмотреть свою проверку для лучшего опыта. Допустим, я ввел пароль 'woot'. Это провалится, потому что слишком короткое. Затем я делаю «wootwootwoot». Теперь он терпит неудачу, потому что у него нет чисел. Тогда 'w00twootwoot', не имеет капитала. Тогда 'W00twootwoot', не имеет символа. В какой момент, если я не буду входить в ваше приложение, чтобы выполнить свою работу, я собираюсь подгонять и пойти на что-то еще. Пересмотрите свою проверку, чтобы рассказать мне все * о требованиях к паролю спереди и сделать проверку, чтобы сообщить мне все недостающие требования, если я не ударил их. 13 авг. 132013-08-13 21:33:09

+2

Вы знаете @Freiheit Я на самом деле думал, что, если мои пользователи войдут в список (для 6 проверок). Я на самом деле делаю это прямо сейчас. Я был бы очень злится, особенно в моей регистрационной форме, потому что у меня также есть секретный вопрос, и ответы на эти вопросы возвращаются, если происходит ошибка: P 13 авг. 132013-08-13 21:36:13

+29

Из любопытства, почему «слишком длинное» ограничение? Мое ограниченное понимание гласит, что после того, как вы сделаете хэш-пароль, это должно быть неуместно 14 авг. 132013-08-14 05:01:11

  0

Я бы проголосовал, чтобы закрыть этот вопрос на основе мало что можно сказать. Во-первых, из-за самих требований http://xkcd.com/936/ вы не должны заставлять человека страдать от попадания глупого бессознательного слова только потому, что считаете его безопасным. И, во-вторых, почему вы хотите еще больше подвергнуть пыткам лицо, которое не говорит им о своем безумном требовании? Это даже вопрос, который вы должны задать? Извините, почему я извиваюсь при регистрации 14 авг. 132013-08-14 19:39:33

+2

@Quillion. Тот факт, что это как-то проблема [XY] (http://meta.stackexchange.com/q/66377/146482) (спрашивая о том, чтобы показать ограничения пароля, утверждающие такие ограничения, на самом деле неоспоримо хорошая идея, и, к счастью, большинство ответов здесь также затрагивают эту проблему) не является основанием для закрытия вопроса - напротив, любой, кто спрашивает об этом, должен найти ответы здесь довольно просвещенными. Тем не менее, вы можете опросить вопрос по своему усмотрению, поскольку вы, очевидно, считаете его «не полезным» 16 авг. 132013-08-16 10:17:02

  0

Я позволю своим пользователям ввести любой пароль, который им нужен, всего лишь с 3 символами. если они хотят ввести неверный пароль, это полностью на них. почему меня это волнует? 02 дек. 142014-12-02 21:41:16

98

Если вы не разгласите свои «требования к паролю», ваши пользователи будут вас ненавидеть. Некоторым не удастся найти «приемлемый пароль» и вызовет службу поддержки. Или, что еще хуже, если пользователи клиентов, то они пойдут покупать в другом месте. Отличный способ убить свой бизнес!

С другой стороны, если разглашение ваших «требований к паролю» действительно помогает злоумышленникам в незначительной степени, тогда ваши требования к паролю ужасно плохи: они не только антагонизируют пользователей, но также ограничивают пользователей небольшой набор возможных паролей.

Обратите внимание, что злоумышленники обычно могут догадываться, какие ваши «требования к паролю», например. пытаясь зарегистрироваться.

В любом случае, «требования к паролю» являются контрпродуктивными, а уменьшает безопасность, за исключением «минимальной длины», которая может быть рационально оправдана. Так что просто не делай этого. Ключом к безопасности пароля является пользовательское образование, возможно, с некоторыми инструментами (например, случайным генератором для надежных паролей). Принудительные ограничения не помогают; и принуждение скрытых ограничений только хуже. Например, если ваши правила требуют по крайней мере одной цифры и одного символа, то удивительно высокая доля пользователей просто добавит «1.», в конце их пароля; Нападавшие это знают. Дополнительный суффикс не будет сильно влиять на энтропию паролей (то есть количество потенциальных паролей, которые атакующий должен попробовать для успешного перерыва), но будет использовать некоторые из скудных ресурсов, известных как «терпение пользователя»: пользователи предпочтут более короткие пароли, так как они должны добавить «1.», суффикс, чтобы успокоить ваш сервер.

+2

Очень хороший ответ, и да, ваш абсолютно верно, они меня ненавидят ... даже больше, чем они ненавидят меня atm: P Хорошо, вы ответили на мой главный вопрос: Нападавший может попытаться зарегистрировать себя и найти то, что точно соответствует моим требованиям PW. 13 авг. 132013-08-13 21:23:15

  0

@Tom Leek - есть ли у вас какие-либо предложения о том, как объединить случайный генератор с формой регистрации? Я думаю, что проверка подлинности приложения Google будет аналогичной, но, возможно, у вас возникла другая идея ... 14 авг. 132013-08-14 00:02:15

+13

Просто хотел поддержать требование ненависти к пользователю. Там, где я работаю, требования к паролю скрыты, и обычно мне требуется как минимум 5-10 минут, чтобы создать пароль, который система фактически позволит мне использовать. Если требования скрыты, попытки могут быстро привести к ярости пользователей. 14 авг. 132013-08-14 01:29:12

  0

Хороший ответ, но одно предложение: обучение пользователей действительно не работает. Вместо этого безопасность должна быть настолько прозрачной, насколько это возможно, и не нуждается в естественном руководстве хорошими решениями. Пользователи не хотят изучать совершенно новое поле только для того, чтобы выполнить свою дневную работу. Они просто хотят получить свою работу. 14 авг. 132013-08-14 05:21:06

+1

@Jedidja: для генератора паролей укажите его как кнопку на той же странице, что и форма входа в систему. Если кнопка нажата, то генерируется и отображается новый случайный пароль. Однако не заполняйте поле ввода пароля: пользователю по-прежнему нужно _remember_ пароль, и включение его в него дважды - это хорошее начало для этого (так что вы должны отображать его _ как изображение_, а не как текст, который можно скопировать, с помощью мыши). 14 авг. 132013-08-14 10:41:55

  0

@TomLeek, в котором ваши учетные записи ваших сайтов только безопасны, как адрес электронной почты, который они предоставили для процесса восстановления учетной записи. Скорее всего, доля учетных записей, принадлежащих пользователям, которые не рвутся, перестает забывать пароль. 14 авг. 132013-08-14 14:01:00

+3

@DanNeely: вот почему я выступаю за генератор паролей _non-обязательный_. Важно, что это необязательно; он не должен быть принужден к пользователям, иначе они восстанут, и это последнее, чего мы хотим. Генератор паролей - полезный инструмент, который _complements_ нормальный процесс «пользователи сами думают о новом пароле». 14 авг. 132013-08-14 15:13:25

  0

@RixhersAjazi Итак, вы собираетесь показать эти (со всем уважением, нелепыми) требованиями или просто отказаться от них?Обратите внимание, что если вы используете правильное соленое хеширование паролей, нет оправданной необходимости в 'len <100'. 16 авг. 132013-08-16 10:12:18

  0

@TobiasKienzler Обновлен мой OP. 16 авг. 132013-08-16 13:03:47

  0

@ DanielCook Названная энергетическая компания, они попросили ввести пароль. Получил пароль, было сказано, что это неправильно. Зная, что я изменил свой предпочтительный PW, чтобы соответствовать им, попросил требования PW. Реп отказался раскрывать. Объяснил, что я не прошу их рассказать мне, какая часть пароля, которую я дал, была неправильной; Я просто хочу знать, что все требования. Пошел кругами, пока я не сказал: «Если бы я был новым клиентом, создав новый пароль, какие требования вы бы мне дали?» Наконец, Реал дал требования к PW. Я сразу же дал им правильную PW. Оказывается, предпочтительный PW - 1 символ слишком короткий. Добавлено «1» до конца. 29 сен. 152015-09-29 16:17:07

  0

Я больше не мог согласиться. Я хотел изменить свой пароль для своей учетной записи на другом веб-сайте один раз, и все, что я получал, было «_Invalid Data». Насколько это полезно? Я думал, что проблема связана с сервером, так как я не знал, почему я получаю его, поэтому я связался с услугами клиентов. Я попытался изменить через месяц, по-прежнему получил ту же ошибку. Оказывается из-за символа! Какой сайт не допускает символов в паролях? 26 янв. 162016-01-26 18:32:20


26

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

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

  0

Просто имейте в виду, что было бы лучше просто не применять такие требования, так как это побуждает пользователей записывать свой сложный пароль рядом с их ПК. Или они просто равны «забыли пароль == login button» 16 авг. 132013-08-16 10:13:57

  0

@TobiasKienzler Я уверен, что этого не произойдет. Тем не менее, если им нужно использовать забыли пароль, я буду в порядке. Мне нравится ваш вклад в этот вопрос! 16 авг. 132013-08-16 13:07:04

  0

@RixhersAjazi Добро пожаловать, спасибо за дополнительную информацию.Хорошо, что вы решили показать информацию сейчас, по крайней мере, после первой попытки, это то, с чем я мог бы справиться, если услуга была достаточно интересной;) И приятно слышать, что вы используете bcrypt, но зачем ограничивать пароль до 100 символов? Разумеется, более разумный предел, чем, скажем, 20, хотя ... Тем не менее, пожалуйста, передумайте [комментарий Тома Лика] (http://security.stackexchange.com/questions/40564/is-it-safe-to-show- пользователи-why-their-password-is-not-allowed/40565? noredirect = 1 # comment64654_40569) о пользователях, восстающих, если вы _enforce_ это 16 авг. 132013-08-16 18:24:04

  0

@TobiasKienzler Я вроде не могу этого принудить = \ Я полностью согласен с вами всеми это довольно сумасшествие, но, с другой стороны, мой ИТ-отдел в школе, в которой я участвую (я все еще студент, на котором я даже не работаю в ИТ-отделе), будет иметь «шипение». Чтобы эта программа когда-либо использовалась, я должен был продать ее в ИТ-отдел. Черт, если вы считаете, что требования к этому паролю сумасшедшие, вы должны взглянуть на мои вопросы безопасности: P Это только то, в чем я работаю. Это приложение будет содержать важную информацию о студентах (включая мою информацию). 16 авг. 132013-08-16 22:29:53

  0

@TobiasKienzler О, а не пытаюсь использовать мой собственный рог здесь, но услуга будет очень интересной ... в миллион раз интересней, чем крошечная база данных VB Access, которую может использовать только один пользователь за раз. Мое последнее приложение, которое я создал для офиса, заработало мне рекомендации от VP of the College (WOOT WOOT) 16 авг. 132013-08-16 23:05:33

  0

@RixhersAjazi Пожалуйста, скажите мне, что вопросы безопасности могут быть определены самостоятельно, а не [«Девичья фамилия матери?»] (Http: //security.stackexchange.com/q/29806/3272) ... Может быть, вы должны отправить свой ИТ-отдел на этот сайт, если только они не будут бородатыми старейшинами с ранних дней карнавала слишком горды, чтобы узнать что-то новое - кстати, есть и http: //workplace.stackexchange.com/, где вы могли бы спросить: «Как информировать моих работодателей о своих неразумных решениях, не оскорбляя их»;) 17 авг. 132013-08-17 06:20:37

  0

@RixhersAjazi btw по вопросам безопасности: [Что является хорошей альтернативой вопросам безопасности?] (http: /stackoverflow.com/q/104592/321973) 17 авг. 132013-08-17 06:25:01

  0

Я подумывал о том, чтобы позволить пользователям создавать свои собственные вопросы. Я зашифровываю вопросы, и Bcrypt по ответам, но страх у меня есть, если у пользователя возникает вопрос: когда вы закончили среднюю школу. Я могу это сделать. Большое убеждение в том, что если у вас есть свобода, вы уже потеряли игру с кошкой и мышей, которую мы хотели бы назвать «Безопасность», я также могу сделать SMS ... это довольно просто ... 17 авг. 132013-08-17 13:39:21


8

Подумайте о сценарии - как нападающий получает требования? Скорее всего, потому, что они могут зарегистрироваться. В этом случае тривиально перерабатывать ваши требования, если они слишком сложны для использования без объяснения. Итак, да, безопасно сообщить пользователю, что ваши требования.

Но лучший подход - не требовать пароля вообще, OpenID, если это вообще возможно. Это почти наверняка будет по крайней мере столь же безопасным, как и все, что вы используете для сбора и хранения паролей. И для тех, у кого есть учетная запись gmail или yahoo, это определенно будет проще.

+1

Хотя использование OpenID означает, что вы полагаетесь на внешнюю службу. Какие * могут * (в зависимости от требований) работать для веб-приложения, с которым пользователи взаимодействуют, но не будут работать также для веб-службы (связь между компьютером) или для локально установленного приложения, которое должно быть способный работать без доступа к сети, или если служба OpenID недоступна по какой-либо другой причине. 15 авг. 132013-08-15 09:20:54

+1

@ MichaelKjörling: для взаимодействия компьютер-компьютер что-то вроде токена OAuth, вероятно, лучше, чем пароль. 15 авг. 132013-08-15 14:14:50

  0

@MaciejPiechotka Возможно, но ответ говорил конкретно об использовании «OpenID, если это вообще возможно». 15 авг. 132013-08-15 14:17:27


17

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

Чтобы противостоять этому, сначала проверьте пользователя с помощью обычных средств (email, captcha и т. Д.) И отправьте им токен паролей. Это уже уменьшает количество поддельных действительных пользователей и блокирует слишком много изменений пароля в определенное время, когда вы делаете жизнь хакеров более сложной. Однако вы все равно должны сообщать все требования для пароля не позднее, чем после первой попытки ввода недопустимого.

Но еще лучше, я рекомендую не заставлять пользователей выбирать произвольно сложный пароль, что они будут просто в конечном итоге записываемое на пост-это рядом с их монитором (или с их сбросить свой пароль, упрощенный «логин»). Вместо этого сообщите им , что их пароль слабый, сообщите им, какой еще хороший, но незабываемый пароль (например, используйте вместо него фразу) и разрешите им продолжить все, нажав «Да, я понял, что мой пароль не очень безопасно, позвольте мне в любом случае продолжить »- это их вина, если учетная запись взломана, и вы не должны нести ответственность после этого явного предупреждения. Предполагая, что вы использовали, использовали правильное и установленное хеширование пароля вместо homebrew-crap или, что еще хуже, открытого текста.

+3

Кроме того, пароль с более строгим паролем на 20 символов более безопасен (~ 94b), а затем пароль с 8 символами, имеющий буквы и символы в нижнем и верхнем регистре, символы и цифры (~ 52b), если оба они абсолютно случайны, но первые не будут разрешены, быть. 14 авг. 132013-08-14 10:21:00

+2

[Точно.] (Http://xkcd.com/936/) В конечном счете все ограничения пароля _enforced_ приводят к сбою, пользователю должно быть предложено установить, должен ли соответствующий доступ не защищаться посредством, например, сгенерированный пароль KeePass в этом случае ... 14 авг. 132013-08-14 10:24:55