sql: как проверить надежность пароля

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

У меня есть устаревшая таблица с паролями, и мне нужно один раз проверить надежность тестового пароля в SSMS и исправить их.

Требования к текущей системе:

  1. не менее 2 символов нижнего регистра ( abcdefg ... )
  2. не менее 2 символов верхнего регистра ( ABCDEFG ... )
  3. минимум 2 числа ( 123456 ... )
  4. минимум 2 подстановочных знака ( ~!@#$%^& ... )
  5. минимальная длина должна быть 8 символов

Спасибо


person armen    schedule 12.02.2014    source источник
comment
Подтвердить на переднем конце   -  person Linga    schedule 12.02.2014
comment
для этого случая нет интерфейса   -  person armen    schedule 12.02.2014
comment
И как это должно работать в теории?   -  person Alexander    schedule 12.02.2014
comment
Если нет внешнего интерфейса, то что, если ваши указанные выше критерии не удовлетворены? я имею в виду, что вы пытаетесь достичь ??   -  person Krishnraj Rana    schedule 12.02.2014
comment
есть старая таблица с паролями, и мне нужно один раз проверить надежность пароля в SSMS и исправить их   -  person armen    schedule 12.02.2014
comment
Почему этот вопрос был отложен? Вопрос очень простой и не требует дополнительной информации. Его можно было бы переформулировать так: Как вы используете SQL для проверки столбца varchar на соответствие следующим требованиям...?. Смотрите мой ответ ниже.   -  person Dan    schedule 12.02.2014
comment
@ling.s, OGHaza, DontVoteMeDown, Mario и Saurabh — что именно не так с моим вопросом? что именно вы не поняли из заданного вопроса? помогите понять что я сделал не так! как вы можете заметить, на мой вопрос уже был дан ответ. это какая-то демонстрация силы? пожалуйста, не забывайте, что такое stackoverflow!   -  person armen    schedule 13.02.2014


Ответы (1)


Как уже упоминалось, этот вид проверки НАМНОГО лучше подходит для приложения, ответственного за запись данных в базу данных в первую очередь. Одна из причин заключается в том, что SQL совершенно ужасен для сложных операций со строками.

Но если вам действительно нужно сделать это с помощью SQL, что-то вроде этого должно указать вам правильное направление:

SELECT Password,
    CASE WHEN 
        Password COLLATE Latin1_General_BIN LIKE '%[a-z]%[a-z]%' AND
        Password COLLATE Latin1_General_BIN LIKE '%[A-Z]%[A-Z]%' AND
        Password LIKE '%[0-9]%[0-9]%' AND
        Password LIKE '%[~!@#$%^&]%[~!@#$%^&]%' AND
        LEN(Password) >= 8
    THEN 1 ELSE 0 END AS Valid
FROM TableWithPasswords

Столбец «Действительный» будет содержать 1, если пароль удовлетворяет критериям операторов CASE, и 0 в противном случае. Если вы хотите добавить дополнительные специальные символы к 4-му требованию, не забудьте правильно экранировать их, в соответствии с этим: http://technet.microsoft.com/en-us/library/ms179859.aspx

Обратите внимание на операторы COLLATE — это необходимо для обеспечения сравнения с учетом регистра для оператора LIKE.

person Dan    schedule 12.02.2014
comment
очень близко, но '11aAAA##' должен возвращать 0 вместо 1 (один символ нижнего регистра вместо 2+). также COLLATE Latin1_General_CS_AS в конце дает мне ошибку (неправильный синтаксис рядом с ключевым словом «COLLATE») - person armen; 12.02.2014
comment
Я отредактировал свой пост. Не могли бы вы попробовать еще раз, пожалуйста? На этот раз оператор COLLATE должен гарантировать, что каждое из сравнений чувствительно к регистру, и поэтому '11aAAA##' должен возвращать 0, поскольку первое сравнение будет ложным. - person Dan; 12.02.2014
comment
я пробовал, и это все еще не работает правильно. '11aAAA##' по-прежнему возвращает 1. вы можете проверить это здесь: sqlfiddle.com/#!6 /b11c0/1 - person armen; 12.02.2014
comment
Согласно этот пост вам может понадобиться измените сопоставление на Latin1_General_BIN. Я отредактировал свой пост. sqlfiddle.com/#!6/b11c0/2 - person Dan; 12.02.2014