1. В нашем продукте есть функция проверки пароля, которая проверяет введенную фразу по списку слабых паролей. Следующий метод удаляет части пароля, которые попали в этот список:
import org.apache.commons.lang.StringUtils;
private String removeContaining(final String passwd, final List<String> list) {
String lpasswd = passwd.toLowerCase();
for (final String element : list) {
if (element != null) {
lpasswd = StringUtils.remove(lpasswd, element.toLowerCase()); //removing the hits
}
}
return lpasswd;
}
А затем проверяется остальная часть для компиляции с минимальной длиной и другими критериями. Как лучше реорганизовать этот метод, если запрещенный список может содержать одиночные символы?
Так, например, если список содержит «a» и «b», введенный пароль - «abc23b $ aa». это станет "c23 $". Или мы должны запретить нашим клиентам помещать однобуквенные слова в такие списки?
2. Изучив эту проблему, я нашел описание механизма обработки пароля Azure: https://docs.microsoft.com/en-us/azure/active-directory/authentication/concept-password-ban-bad#step -2-check-if-password-is-считается- забанен Из статьи:
Каждый забаненный пароль, найденный в пароле пользователя, получает одно очко. Каждый оставшийся уникальный персонаж получает одно очко. Пароль должен быть не менее пяти (5) баллов, чтобы его можно было принять. В следующих двух примерах предположим, что Contoso использует Azure AD Password Protection и имеет «contoso» в своем пользовательском списке. Предположим также, что в глобальном списке «пусто».
Пример: пользователь изменяет свой пароль на «C0ntos0Blank12»
После нормализации этот пароль становится «contosoblank12». Процесс сопоставления обнаруживает, что этот пароль содержит два запрещенных пароля: contoso и blank. Этот пароль затем получает оценку:
[contoso] + [пробел] + 1 + [2] = 4 балла. Поскольку этот пароль меньше пяти (5) баллов, он будет отклонено.
Но если в словаре содержатся "Contoso" и "cont", как будет рассчитываться общий балл (в сравнении с "contoso" или "cont")?
Спасибо.