Проверка надежности пароля с помощью JavaScript

У меня есть функция, которая проверяет поле «Пароль» и предлагает пользователю ввести сильный пароль . У меня также есть метка с названием «Сила пароля», ссылаясь на силу пароля ( очень слабая, слабая, средняя и т. Д.).

Мне просто интересно, есть ли лучший способ переписать этот код.

 функция chkPasswordStrength (txtpass, strenghtMsg, errorMsg)
   {
     var desc = new Array ();
     desc [0] = "Очень слабый";
     desc [1] = "Слабый";
     desc [2] = «Лучше»;
     desc [3] = "Medium";
     desc [4] = «Сильный»;
     desc [5] = «Самый сильный»;
   
     errorMsg.innerHTML = ''
     var score = 0;

     //если txtpass больше 6 дает 1 балл
     if (txtpass.length> 6) оценка ++;

     //если txtpass имеет как нижний, так и верхний регистр, дайте 1 балл
     if ((txtpass.match (/[a-z] /)) & & (txtpass.match (/[A-Z] /))) оценка ++;

     //если txtpass имеет хотя бы одно число, дайте 1 балл
     if (txtpass.match (/\ d + /)) оценка ++;

     //если txtpass имеет по крайней мере один специальный каратан, дайте 1 балл
     if (txtpass.match (/.[!,@,#,$,%,Õ,&, *,?, _, ~, -, (,)] /)) оценка ++;

     //если txtpass больше 12, дайте еще одну точку
     if (txtpass.length> 12) оценка ++;

     strenghtMsg.innerHTML = desc [score];
     strenghtMsg.className = "прочность" + оценка;

если (txtpass.length <6)
{
errorMsg.innerHTML = "Пароль должен быть не менее 6 символов"
errorMsg.className = "errorclass"
}


   }
 <style type = "text /css">
             .strength0
            {
                ширина: 200px;
                фон: # B20E37;
                text-align: center;
                font-weight: bold;
            }
 
            .strength1
            {
                ширина: 200px;
                фон: # D32847;
                text-align: center;
                font-weight: bold;
            }
 
            .strength2
            {
                ширина: 200px;
                фон: # ff5f5f;
                text-align: center;
                font-weight: bold;
            }
 
            .strength3
            {
                ширина: 200px;
                фон: # 83D680;
                 text-align: center;
                font-weight: bold;
            }
 
            .strength4
            {
                фон: # 4dcd00;
                ширина: 200px;
                 text-align: center;
                font-weight: bold;
            }
 
            .strength5
            {
                фон: # 399800;
                ширина: 200px;
                text-align: center;
                font-weight: bold;
            }

.errorclass
{
начертание шрифта: жирный;
размер шрифта: 10 пикселей;
   цвет: # 4F080B;
  font-family: Arial,
}
& Lt; /тип >
 <tr>
<% = метка «Пароль»,: обязательный => true%>
& Lt; & тд GT;

<input id = "user_password" type = "password" size = "30" name = "user [password]" onkeyup = "chkPasswordStrength (this.value, document.getElementById ('strendth'), document.getElementById ('error «))" >
                 
& Lt; /тд >

<td id = "strendth" class = "strength5"> <b> Сила пароля </td>

& Л; /тр >
& Lt; & тр GT; & Lt; & тд GT; & Lt; /тд >
50 голосов | спросил Pavan 5 FebruaryEurope/MoscowbWed, 05 Feb 2014 15:33:19 +0400000000pmWed, 05 Feb 2014 15:33:19 +040014 2014, 15:33:19

5 ответов


53
  

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

В этом случае я не просматриваю код, но я просматриваю вашу логику программы.

Краткий разговор о безопасности паролей

Сначала определим правила, которые вы используете (термин «специальные символы» здесь для дальнейшего относится к набору ! @ # $% ^ & *? _ ~ - ()):

  • Длина пароля> 6: 1 Точка
  • Длина пароля> 12: 1 Точка
  • Пароль содержит хотя бы одну нижнюю и одну верхнюю букву: 1 пункт
  • Пароль содержит хотя бы одну цифру: 1 пункт
  • Пароль содержит хотя бы один из специальных символов: 1 пункт

Ваша шкала от 0 (очень слабо) до 5 (сильнейшая). Это означает, что пароль, основанный на длине, никогда не может превышать 2 (лучше), но короткий пароль может быть 4 (сильный). Это плохо, если учесть, что надежные пароли не обязательно использовать широкий набор символов .

Следующие пароли считаются сильными по вашему алгоритму:

  • ABCDE $ 1
  • QWERT! 1
  • 1111Aa @

Теперь для меня это не выглядит сильным, давайте посмотрим, сколько возможных комбинаций имеет такой пароль. Общий набор символов для этих паролей равен 26 (нижний) + 26 (верхний) + 10 (цифры) + 14 (специальный) = 76.

  

76 ^ 7 = ~ 1,4 * 10 ^ 13 = ~ 14 трлн

Таким образом, атакующий, который знает набор символов и длину пароля, должен искать примерно 14 триллионов комбинаций, пока не найдет пароль. Хотя, это худший вариант, может быть, что они находят это с третьей попытки, но может быть, что это будет рядом с последним. Сегодняшние компьютеры могут делать более 500 миллионов догадок в секунду, это примерно 8 часов ... это никак нельзя считать безопасным.

Давайте посмотрим на другую сторону спектра, только следующий пароль считается лучше:

  

thisisaverylongpasswordbecause (Это очень длинный пароль, потому что)

Он имеет только набор символов из 26 и длину 30 (максимальный для вашей системы, если я видел это правильно).

  

26 ^ 30 = ~ 2.8 * 10 ^ 42 = ~ 2.8 тредэкиллион

У меня есть идея no , что это число должно означать, , поэтому давайте сравним его . Ладно, это не помогает ... может быть, если мы поместим это в таймфрейм, 500 миллионов догадок в секунду снова:

  

~ 1.8 * 10 ^ 26 лет

Это действительно хорошие новости! Это хорошо до жары смерти Вселенной.

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

Невозможно определить надежность пароля. Но мы знаем две вещи:

  1. Чем дольше это происходит, тем больше комбинаций вы должны пройти.
  2. Чем больше разных символов он использует, тем больше комбинаций вы должны пройти.

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

Несмотря на то, что, по-видимому, уязвим для атак на словах, Oxford Dicitonary содержит 300 тысяч основных записей , поэтому, если у нас есть ключевая фраза из 4 слов, это:

  

300000 ^ 4 = 8.1 * 10 ^ 21

И это не учитывает возможные ошибки, если слова начинаются с прописных, строчных или смешанных и разных языков.

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

Продайте его как функцию!

Это сделает ваш маркетинговый отдел счастливым, вы просто внедрили поддержку более безопасных кодовых фраз в ваше программное обеспечение! Сообщите своим пользователям об этом, просто добавив короткую информацию в поле пароля:

  

Мы поддерживаем кодовые фразы длиной до XX символов!

     

Пароли более безопасны и легче запоминаются, чем обычные пароли.

И короткая информация о том, как «создать», и отбросить любой индикатор, если пароль защищен или нет.

Кто может ине может помочь

Существует довольно много групп пользователей, вопрос заключается в том, с кем вы хотите связаться с помощью этой помощи. Определим три группы:

  • «Средний пользователь», который не понимает, зачем им нужно нажать кнопку «Удалить», чтобы удалить что-то.
  • Обычный пользователь, всегда готовый учиться и выглядящий вне собственного носа.
  • Технический пользователь уже использует менеджер паролей и /или кодовые фразы.

Как бы вы ни старались, вы не сможете помочь «среднему пользователю». Если вы сообщите им использовать пароль минимальной длины 6, они будут использовать «123456» или «asdfgh». Если вы сообщите им использовать пароль минимальной длины 12, они будут использовать «asdfghjkzxcvbn» или «000000000001». Они находятся вне надежды и будут активно обходными мерами безопасности, которые вы реализуете. Просто дайте им быть.

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

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

Защищенные пароли, хранящиеся в незащищенном состоянии, небезопасны

Неважно, насколько хорош пароль или кодовая фраза, если вы не можете хранить безопасным образом, они небезопасны.

Мы полностью откажемся от социальной инженерии или «вредных» пользователей (есть люди, у которых есть свой PIN-код кредитной карты на заметке в одном кошельке), мы не можем им помочь.

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

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

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

Задайте нужным людям правильные вопросы

И последнее, но не менее важное: определение того, что является надежным паролем, зависит от многих факторов. Если вы сомневаетесь, заплатите людям в службе безопасности , вот для чего они предназначены.

ответил Bobby 5 FebruaryEurope/MoscowbWed, 05 Feb 2014 16:29:45 +0400000000pmWed, 05 Feb 2014 16:29:45 +040014 2014, 16:29:45
14

Как уже упоминалось Тимом Сегуином, не используйте onkeyup, вместо этого используйте addEventListener и attachEvent, если вам нужно поддерживать более старые версии IE.

Кроме того: chkPasswordStrength (txtpass, strenghtMsg, errorMsg), к сожалению, назван, вы disemvoweled check без уважительной причины, txtpass может просто быть password и ваши 2 Msg параметры не являются сообщениями, как можно было бы подумать, но элементы DOM вместо этого.

Сначала вы очищаете errorMsg.innerHTML, но вы не сбрасываете className, я бы:

if (txtpass.length <6)
 {
   errorMsg.innerHTML = «Пароль должен быть не менее 6 символов»;
   errorMsg.className = "errorclass";
 }
 еще
 {
   errorMsg.innerHTML = "";
   errorMsg.className = "";
 }

Кроме того, я бы написал

var desc = new Array ();
 desc [0] = "Очень слабый";
 desc [1] = "Слабый";
 desc [2] = «Лучше»;
 desc [3] = "Medium";
 desc [4] = «Сильный»;
 desc [5] = «Самый сильный»;

как

var strongs = ['Very weak', 'Weak', 'Better', 'Medium', 'Strong', 'Strongest'];
ответил konijn 5 FebruaryEurope/MoscowbWed, 05 Feb 2014 19:04:44 +0400000000pmWed, 05 Feb 2014 19:04:44 +040014 2014, 19:04:44
13

Вы повторяете много CSS. Исправьте это, используя идентификатор #strength.

<style type = "text /css">
#прочность {
    ширина: 200 пикселей;
    text-align: center;
    font-weight: bold;
}

.strength0 {
    background-color: # B20E37;
}

.strength1 {
    background-color: # D32847;
}

.strength2 {
    background-color: # ff5f5f;
}

.strength3 {
    background-color: # 83D680;
}

.strength4 {
    background-color: # 4dcd00;
}

.strength5 {
    background-color: # 399800;
}

.errorclass {
    размер шрифта: 10 пикселей;
    font-family: Arial;
    font-weight: bold;
    цвет: # 4F080B;
}
& Lt; /тип >

Примечания:

  • Повторите свое правило для .errorclass. Ваше объявление font-family заканчивается на , вместо ;.
  • По-моему, всегда нужно оставлять пробел между знаками : и объявлениями свойств. Это просто улучшает читаемость.
  • Имейте в виду при использовании стенограммы свойства. Пример того, что может случиться: если вы пишете background: red;, это не только устанавливает background-color на красный. Он также применяет значения по умолчанию для других свойств, доступных в сокращенном синтаксисе (background-image, background-repeat, ...)
ответил kleinfreund 5 FebruaryEurope/MoscowbWed, 05 Feb 2014 20:57:46 +0400000000pmWed, 05 Feb 2014 20:57:46 +040014 2014, 20:57:46
11

Бобби дал отличный ответ о силе пароля, поэтому я сосредоточусь на коде.

Reg ex

У вас есть следующее регулярное выражение:

 /. [!, @, #, $,%, ^, &, *,?, _, ~, -, (,)] /

Он соответствует одному символу без строчки, за которым следуют любые из следующих символов !, @, #, $,%, ^, &, *,?, _, ~ или символ в диапазоне от запятой до запятой или любой из следующих (,). Вы повторяете запятую, как будто это разделитель. Класс символов не нуждается в разделителях, поэтому поместить запятую в символьный класс просто означает, что он будет соответствовать запятой. С другой стороны, тире имеет особое значение в классе символов, поэтому вам нужно будет избежать его, если вы хотите, чтобы класс символов содержал тире.

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

В контексте кажется странным, что вы включаете так мало символов в специальный класс символов. Для этой функции кажется логичным просто определять специальные символы как что-либо не в других классах символов:

 /[^ A-Za-z0-9] /

Альтернативно, если вы по какой-то причине хотите только основные специальные символы ASCII для печати , вы можете легко включить их все, используя диапазоны (используйте карту символов, чтобы найти такие диапазоны):

 /[\ - \ /\: - \ @ \ [- \ `\ {- \ ~] /

Вот краткое описание того, как это работает:

 /[//начало выражения /диапазона
  \ - \ ///Все символы от "" до "/"
  \: - \ @ //Все символы от ":" до "@"
  \ [- \ `//Все символы от" ["до" `"
  \ {- \ ~ //Все символы от "{" до "~"
] ///завершение диапазона /выражение

Вызов функции

В вашем HTML есть следующее:

 <input id = "user_password" type = "password" size = "30" name = "user [password]" onkeyup = "chkPasswordStrength (this.value , document.getElementById ( 'strendth'), document.getElementById ( 'ошибка')) ">

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

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

Очистить таблицы

Я не уверен, что именно делает этот ярлык Rails, но если что-то отображается на своем месте, результат скорее всего является незаконным HTML и, следовательно, может быть непоследовательным поведением браузера. Вы можете заключить полную таблицу в другой элемент или вы можете поместить элемент внутри одного элемента td или th. Все, что находится между ними, обычно не допускается.

ответил aaaaaaaaaaaa 6 FebruaryEurope/MoscowbThu, 06 Feb 2014 16:24:47 +0400000000pmThu, 06 Feb 2014 16:24:47 +040014 2014, 16:24:47
6

У вас есть 1 проверка (менее 6 символов), которая дает ошибку, но вы выполняете ее ПОСЛЕ всех проверок без ошибок. Это означает, что если я сделаю пароль 12345, он даст мне 1 балл, хотя для этой цели он полностью недействителен.

Вы должны перенести эту проверку перед остальными и вернуть, если она не удалась, потому что сейчас вы просто теряете ценную скорость процессора, если пароль меньше 6 символов.

, кроме того, вы даете 1 балл, если оно превышает 6 символов, но вы даете сообщение об ошибке, если оно ниже. так что либо у них есть точка, либо они получают ошибку. поэтому у вас не может быть 0 очков. почему тогда есть категория для 0?

Наконец, вы внедряете извлечение элементов DOM в свой вызов функции в HTML, чего следует избегать. Я бы просто передал имя элемента и выполнил поиск DOM в самой функции.

ответил Nzall 6 FebruaryEurope/MoscowbThu, 06 Feb 2014 13:27:51 +0400000000pmThu, 06 Feb 2014 13:27:51 +040014 2014, 13:27:51

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132