Рубрики
Без рубрики

Путеводитель по Пассай

Узнайте, как использовать библиотеку Passay для проверки паролей и генерации

Автор оригинала: Patryk Kucharz.

1. Введение

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

Для создания таких паролей или проверки их мы можем использовать Библиотека Пассай .

2. Зависимость от Maven

Если мы хотим использовать библиотеку Passay в нашем проекте, необходимо добавить следующую зависимость к нашему пом.xml :


    org.passay
    passay
    1.3.1

Мы можем найти его здесь .

3. Проверка паролей

Проверка паролей является одной из двух основных функций, предоставляемых библиотекой Passay. Это легко и интуитивно понятно. Давайте обнаружим это.

3.1. ПарольДанные

Чтобы проверить наш пароль, мы должны использовать PasswordData. Это контейнер для информации, которая необходима для проверки. Он может хранить такие данные, как:

  • пароль
  • имя пользователя
  • список ссылок на пароли
  • происхождение

Свойства паролей и имен пользователей объясняются. Passay библиотека дает нам ИсторическоеРеференция и ИсточникРеференс которые мы можем добавить в список ссылок на пароли.

Мы можем использовать поле происхождения для хитя информации о том, был ли пароль сгенерирован или определен пользователем.

3.2. ПарольВалидатор

Мы должны знать, что нам ПарольДанные и ПарольВалидатор объектов для начала проверки паролей. Мы уже обсудили ПарольДанные . Давайте создадим ПарольВалидатор сейчас.

Во-первых, мы должны определить набор правил проверки паролей. Мы должны передать их конструктору при создании ПарольВалидатор объект:

PasswordValidator passwordValidator = new PasswordValidator(new LengthRule(5));

Есть два способа передачи нашего пароля на ПарольДанные объект. Мы передавайте его конструктору или методу сеттера:

PasswordData passwordData = new PasswordData("1234");

PasswordData passwordData2 = new PasswordData();
passwordData.setPassword("1234");

Мы можем проверить наш пароль, позвонив проверить () метод на ПарольВалидатор :

RuleResult validate = passwordValidator.validate(passwordData);

В результате мы получим ПравилоРесульт объект.

3.3. ПравилоРезульт

ПравилоРесульт содержит интересную информацию о процессе проверки. Это происходит в результате проверить () метод.

Прежде всего, он может сказать нам, является ли пароль действительным:

Assert.assertEquals(false, validate.isValid());

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

RuleResultDetail ruleResultDetail = validate.getDetails().get(0);
Assert.assertEquals("TOO_SHORT", ruleResultDetail.getErrorCode());
Assert.assertEquals(5, ruleResultDetail.getParameters().get("minimumLength"));
Assert.assertEquals(5, ruleResultDetail.getParameters().get("maximumLength"));

Наконец, мы можем изучить метаданные проверки пароля с помощью ПравилоРесультМетатные :

Integer lengthCount = validate
  .getMetadata()
  .getCounts()
  .get(RuleResultMetadata.CountCategory.Length);
Assert.assertEquals(Integer.valueOf(4), lengthCount);

4. Поколение паролей

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

Чтобы создать пароль, мы должны иметь ПарольГенератор объект. После того, как мы его, мы называем generatePassword () метод и список пропусков ПерсонажРулес . Вот пример кода:

CharacterRule digits = new CharacterRule(EnglishCharacterData.Digit);

PasswordGenerator passwordGenerator = new PasswordGenerator();
String password = passwordGenerator.generatePassword(10, digits);

Assert.assertTrue(password.length() == 10);
Assert.assertTrue(containsOnlyCharactersFromSet(password, "0123456789"));

Мы должны знать, что нам нужен объект ПерсонажДанные для создания ПерсонажРуле . Еще один интересный факт заключается в том, что библиотека предоставляет нам EnglishCharacterData. Это энум из пяти наборов символов:

  • Цифр
  • нижний регистр английский алфавит
  • верхний регистр английский алфавит
  • сочетание нижнего регистра и верхнего регистра наборов
  • специальные символы

Тем не менее, ничто не может остановить нас от определения нашего набора символов. Это так же просто, как реализация ПерсонажДанные интерфейс. Давайте посмотрим, как мы можем это сделать:

CharacterRule specialCharacterRule = new CharacterRule(new CharacterData() {
    @Override
    public String getErrorCode() {
        return "SAMPLE_ERROR_CODE";
    }

    @Override
    public String getCharacters() {
        return "[email protected]#";
    }
});

PasswordGenerator passwordGenerator = new PasswordGenerator();
String password = passwordGenerator.generatePassword(10, specialCharacterRule);

Assert.assertTrue(containsOnlyCharactersFromSet(password, "[email protected]#"));

5. Положительные правила сопоставления

Мы уже узнали, как мы можем генерировать и проверять пароли. Для этого нам необходимо определить набор правил. По этой причине, мы должны знать, что Есть два типа правил, доступных в Пассай : положительные правила сопоставления и отрицательные правила сопоставления.

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

Положительные правила сопоставления принимают пароли, которые содержат предоставленные символы, регулярные выражения или вписываются в некоторые ограничения.

Существует шесть положительных правил сопоставления:

  • РазрешеноCharacterRule – определяет все символы, которые пароль должен включать
  • РазрешеноRegexRule – определяет обычное выражение, которое пароль должен соответствовать
  • ПерсонажРуле – определяет набор символов и минимальное количество символов, которые должны быть включены в пароль
  • LengthRule – определяет минимальную длину пароля
  • ПерсонажХарактеристикаРуле – проверяет, выполняет ли пароль N определенных правил.
  • LengthComplexityRule – позволяет нам определить различные правила для разных длин паролей

5.1. Простые положительные правила сопоставления

Теперь мы охватим все правила, которые имеют простую конфигурацию. Они определяют набор юридических символов или шаблонов или длину приемлемого пароля.

Вот краткий пример обсуждаемых правил:

PasswordValidator passwordValidator = new PasswordValidator(
  new AllowedCharacterRule(new char[] { 'a', 'b', 'c' }), 
  new CharacterRule(EnglishCharacterData.LowerCase, 5), 
  new LengthRule(8, 10)
);

RuleResult validate = passwordValidator.validate(new PasswordData("12abc"));

assertFalse(validate.isValid());
assertEquals(
  "ALLOWED_CHAR:{illegalCharacter=1, matchBehavior=contains}", 
  getDetail(validate, 0));
assertEquals(
  "ALLOWED_CHAR:{illegalCharacter=2, matchBehavior=contains}", 
  getDetail(validate, 1));
assertEquals(
  "TOO_SHORT:{minimumLength=8, maximumLength=10}", 
  getDetail(validate, 4));

Мы видим, что каждое правило дает нам четкое объяснение, если пароль не действителен. Есть уведомления, что пароль слишком короткий и имеет два незаконных символов. Мы также можем заметить, что пароль не соответствует обычному выражению.

Более того, нам сообщают, что он содержит недостаточно букв нижнего регистра.

5.2. ХарактерЧакторизитситсРуле

CharcterCharacterisitcsRule сложнее, чем правила, представленные ранее. Создать CharcterCharacterisitcsRule объект, мы должны предоставить список ПерсонажРуле s. Более того, мы должны установить, сколько из них пароль должен соответствовать. Мы можем сделать это так:

CharacterCharacteristicsRule characterCharacteristicsRule = new CharacterCharacteristicsRule(
  3, 
  new CharacterRule(EnglishCharacterData.LowerCase, 5), 
  new CharacterRule(EnglishCharacterData.UpperCase, 5), 
  new CharacterRule(EnglishCharacterData.Digit),
  new CharacterRule(EnglishCharacterData.Special)
);

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

5.3. ДлинаКомплекситиРуле

С другой стороны, Пассай библиотека предоставляет нам LengthComplexityRule . Это позволяет нам определить, какие правила должны применяться к паролю какой длины. В отличие от ПерсонажХарактеристикаРуле , они позволяют нам использовать все виды правил – не только ПерсонажРуле .

Давайте проанализируем пример:

LengthComplexityRule lengthComplexityRule = new LengthComplexityRule();
lengthComplexityRule.addRules("[1,5]", new CharacterRule(EnglishCharacterData.LowerCase, 5));
lengthComplexityRule.addRules("[6,10]", 
  new AllowedCharacterRule(new char[] { 'a', 'b', 'c', 'd' }));

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

6. Отрицательные правила сопоставления

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

Давайте выясним, каковы отрицательные правила сопоставления:

  • НезаконныйЧакторРуле – определяет все символы, которые пароль не должен содержать
  • НезаконныйRegexRule – определяет регулярное выражение, которое не должно соответствовать
  • НезаконныйСекенсРуле – проверяет, есть ли пароль незаконной последовательности символов
  • NumberRangeRule – определяет диапазон чисел, которые пароль не должен содержать
  • WhitespaceRule – проверяет, содержит ли пароль белые пространства
  • СловарьРуле – проверяет, равен ли пароль какой-либо словарной записи
  • СловарьСубстрингРуле – проверяет, содержит ли пароль какую-либо словарную запись
  • ИсторияПравить – проверяет, содержит ли пароль какую-либо историческую ссылку на пароль
  • ДайджестИсториРуле – проверяет, содержит ли пароль какую-либо усваиваемую историческую ссылку на пароль
  • ИсточникRule – проверяет, содержит ли пароль ссылку на исходный пароль
  • DigestSourceRule – проверяет, содержит ли пароль ссылку на пароль источника дайджеста
  • Имя пользователяRule – проверяет, содержит ли пароль имя пользователя
  • ПовторитеCharacterRegexRule – проверяет, содержит ли пароль повторную ASCII письмена

6.1. Простые отрицательные правила сопоставления

Во-первых, мы увидим, как мы можем использовать простые правила, такие как НезаконныйЧакторРуле , НезаконныйRegexRule и так далее. Вот краткий пример:

PasswordValidator passwordValidator = new PasswordValidator(
  new IllegalCharacterRule(new char[] { 'a' }), 
  new NumberRangeRule(1, 10), 
  new WhitespaceRule()
);

RuleResult validate = passwordValidator.validate(new PasswordData("abcd22 "));

assertFalse(validate.isValid());
assertEquals(
  "ILLEGAL_CHAR:{illegalCharacter=a, matchBehavior=contains}", 
  getDetail(validate, 0));
assertEquals(
  "ILLEGAL_NUMBER_RANGE:{number=2, matchBehavior=contains}", 
  getDetail(validate, 4));
assertEquals(
  "ILLEGAL_WHITESPACE:{whitespaceCharacter= , matchBehavior=contains}", 
  getDetail(validate, 5));

Пример показывает нам, как работают описанные правила. Подобно положительным правилам сопоставления, они дают нам полную обратную связь о проверке.

6.2. Словарные правила

Что делать, если мы хотим проверить, не равен ли пароль предоставленным словам.

По этой причине Пассай библиотека дает нам отличные инструменты для этого. Давайте узнаем СловарьРуле и СловарьСубстрингРуле :

WordListDictionary wordListDictionary = new WordListDictionary(
  new ArrayWordList(new String[] { "bar", "foobar" }));

DictionaryRule dictionaryRule = new DictionaryRule(wordListDictionary);
DictionarySubstringRule dictionarySubstringRule = new DictionarySubstringRule(wordListDictionary);

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

В реальной жизни мы, конечно, загрузим список слов из текстового файла или базы данных. В таком случае, мы можем использовать WordLists . Он имеет три перегруженных методов, которые принимают массив Читатель s и создать ArrayWordList .

6.3. ИсторияПравить и ИсточникРуле

Кроме того, Пассай библиотека дает нам ИсторияПравить и ИсточникRule . Они могут проверять пароли от исторических паролей или текстового контента из различных источников.

Рассмотрим пример:

SourceRule sourceRule = new SourceRule();
HistoryRule historyRule = new HistoryRule();

PasswordData passwordData = new PasswordData("123");
passwordData.setPasswordReferences(
  new PasswordData.SourceReference("source", "password"), 
  new PasswordData.HistoricalReference("12345")
);

PasswordValidator passwordValidator = new PasswordValidator(
  historyRule, sourceRule);

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

С другой стороны, ИсточникRule позволяет нам проверить, отличается ли пароль от тех, которые предусмотрены в ИсточникРеференсии . Мы можем избежать риска иметь одинаковые пароли в разных системах или приложениях.

Стоит отметить, что существуют такие правила, как DigestSourceRule и DigestHistoryRule. Мы покроем их в следующем абзаце.

6.4. Правила переваривания

Есть два правила дайджеста в Пассай библиотека: ДайджестИсториРуле и DigestSourceRule . Правила дайджеста предназначены для работы с паролями, хранящимися в качестве дайджеста или хэша. Следовательно, чтобы определить их, мы должны обеспечить КодированиеШашБин объект.

Давайте посмотрим, как это делается:

List historicalReferences = Arrays.asList(
  new PasswordData.HistoricalReference(
    "SHA256",
    "2e4551de804e27aacf20f9df5be3e8cd384ed64488b21ab079fb58e8c90068ab"
));

EncodingHashBean encodingHashBean = new EncodingHashBean(
  new CodecSpec("Base64"), 
  new DigestSpec("SHA256"), 
  1, 
  false
);

На этот раз мы создаем ИсторическоеРеференция по этикетке и закодированный пароль конструктору. После этого мы мгновенно КодированиеШашБин с правильным алгоритмом Codec и дайджестом.

Кроме того, мы можем указать количество итераций и является ли алгоритм соленым.

После того, как у нас есть кодирующие бобы, мы можем проверить наш пароль дайджеста:

PasswordData passwordData = new PasswordData("example!");
passwordData.setPasswordReferences(historicalReferences);

PasswordValidator passwordValidator = new PasswordValidator(new DigestHistoryRule(encodingHashBean));

RuleResult validate = passwordValidator.validate(passwordData);

Assert.assertTrue(validate.isValid());

Мы можем узнать больше о КодированиеХашинБин в Веб-страница Криптакулярной библиотеки .

6.5. ПовторитеЧарактерРегексРуле

Еще одно интересное правило проверки ПовторитеCharacterRegexRule . Мы можем использовать его, чтобы проверить, содержит ли пароль повторяющиеся ASCII письмена.

Вот пример кода:

PasswordValidator passwordValidator = new PasswordValidator(new RepeatCharacterRegexRule(3));

RuleResult validate = passwordValidator.validate(new PasswordData("aaabbb"));

assertFalse(validate.isValid());
assertEquals("ILLEGAL_MATCH:{match=aaa, pattern=([^\\x00-\\x1F])\\1{2}}", getDetail(validate, 0));

6.6. Имя пользователяRule

Последнее правило, которое мы собираемся обсудить в этой главе, это Имя пользователяRule . Это позволяет нам запретить использование имени пользователя в пароле.

Как мы узнали ранее, мы должны хранить имя пользователя в ПарольДанные :

PasswordValidator passwordValidator = new PasswordValidator(new UsernameRule());

PasswordData passwordData = new PasswordData("testuser1234");
passwordData.setUsername("testuser");

RuleResult validate = passwordValidator.validate(passwordData);

assertFalse(validate.isValid());
assertEquals("ILLEGAL_USERNAME:{username=testuser, matchBehavior=contains}", getDetail(validate, 0));

7. Индивидуальные сообщения

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

Мы можем поместить их в простой файл. Давайте посмотрим, как легко это:

TOO_LONG=Password must not have more characters than %2$s.
TOO_SHORT=Password must not contain less characters than %2$s.

Как только у нас есть сообщения, мы должны загрузить этот файл. Наконец, мы можем передать его в ПарольВалидатор объект.

Вот пример кода:

URL resource = this.getClass().getClassLoader().getResource("messages.properties");
Properties props = new Properties();
props.load(new FileInputStream(resource.getPath()));

MessageResolver resolver = new PropertiesMessageResolver(props);

Как мы видим, мы загрузили message.properties файл и передал его в Недвижимость объект. Тогда мы можем использовать Недвижимость объект для создания СвойстваMessageResolver .

Рассмотрим пример использования разрешитея сообщения:

PasswordValidator validator = new PasswordValidator(
  resolver, 
  new LengthRule(8, 16), 
  new WhitespaceRule()
);

RuleResult tooShort = validator.validate(new PasswordData("XXXX"));
RuleResult tooLong = validator.validate(new PasswordData("ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"));

Assert.assertEquals(
  "Password must not contain less characters than 16.", 
  validator.getMessages(tooShort).get(0));
Assert.assertEquals(
  "Password must not have more characters than 16.", 
  validator.getMessages(tooLong).get(0));

Пример ясно показывает, что мы можем перевести все коды ошибок с валидатором, оснащенным разрешителяцией сообщений.

8. Заключение

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

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

Все примеры, как всегда, можно найти более на GitHub .