Як реалізувати безпечну історію паролів


23

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

Однак зазвичай у вас є вимога зберігати останні n паролів і забезпечити мінімальну складність і мінімальну зміну між різними паролями (щоб запобігти користувачеві використовувати такі послідовності, як Password_1, Password_2, ..., Password_ n ). Це було б тривіально з простими текстовими паролями, але як це зробити, зберігаючи лише хеші?

Іншими словами: як можна реалізувати безпечний механізм історії паролів?


2
Пов’язано: security.stackexchange.com/questions/4704/… (і BTW цей сайт може бути кращим місцем для цього питання). Щодо "мінімальної зміни", я не можу придумати жодної альтернативи генеруванню всіх варіантів, які б кваліфікувалися як "мінімальні зміни" (що може бути ЛОТОм залежно від вашого визначення!) Та порівнювати хеші. Що таке визначення «мінімальна зміна»?
Кевін Вермер

7
Збереження останніх n паролів означає лише, що користувач вибере послідовність, яка працює від 1 до n + 1 .
Йоахім Зауер

11
Я дуже скептичний, що така політика щодо паролів покращує безпеку; ІМХО, це збільшує шанси на те, що люди вдасться зберегти свій пароль на клейкій ноті. Посилання Кевіна - це хороша дискусія. @KevinVermeer - ви фактично можете виміряти кількість змін як відстань Левенштейна ( en.wikipedia.org/wiki/Levenshtein_distance ), також відомий як "відстань редагування".
Натан Лонг

5
Якщо ваша безпека є такою суворою, то ви можете також генерувати випадковий пароль для користувача, змусити його використовувати його та регулярно змінювати його. Таким чином ви маєте повний контроль над їх паролем.
Реаг.

2
@nathan: Збереження паролів на клейкій ноті насправді захищено. Неможливо напасти на пароль, якщо у вас фізичний доступ до клейкої записки - це усуне близько 99% загроз. Помістіть цю нотатку в гаманець чи гаманець, і вам потрібно, як правило, погладити людину, щоб отримати її - значить, порушення безпеки виявлено і може бути пом’якшено.
mattnz

Відповіді:


22

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

Після входу ви вже підтверджуєте введений пароль проти хеша, немає необхідності зберігати пароль у відкритому тексті. Цей же трюк працює, коли йдеться про зміну пароля, просто перевірте введені та "мінімальні зміни" згенерованих паролів на історичні хеші. Якщо новий пароль задовільний, перенесіть поточний хеш пароля до історичного набору та замініть його новим хешем для нового пароля.


Отже, якщо користувач вводить Password6, я повинен виявити числову частину і спробувати, наприклад, Password4 , Password5 , Password7 і так далі. Це правильно?
Wizard79

4
@Lorenzo: Правильно. Генерування альтернатив може бути таким же складним, як ви цього хочете, просто переконайтеся, що ви знайдете правильний компроміс між складністю та ризиком (не дозволяйте вашим користувачам чекати 5 хвилин, поки ви перевіряєте всі можливості, зникаючи ймовірність виникнення ризику).
Martijn Pieters

Я не впевнений, що запропонувати інкріментування числа в кінці є гарною пропозицією зробити користувачам - це трохи передбачувано. І виходить експоненціально тим більше, якщо ви говорите користувачам робити це.
Wyatt Barnett

2
@WyattBarnett: Ніхто не каже користувачам робити це. Сенс полягає в тому, щоб виявити користувачів, які роблять це, і не допустити використання "посиленого" пароля.
Martijn Pieters

Ах, тут зовсім щось неправильно прочитали. Вибачте.
Wyatt Barnett

28

Коли користувач змінює свій пароль, вимагайте від нього ввести свій попередній пароль. Тепер у вас є доступ до двох простих текстових паролів, навіть якщо ви не зберігаєте звичайні текстові паролі у вашій базі даних.

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


Ну, це, безумовно, розумне рішення, якщо у вас немає вимоги тестувати попередні n паролів, проте пропозиція про створення альтернатив вчасно краще. Але генерувати альтернативи обох паролів ще краще!
Wizard79

2
@Lorenzo: Ідея полягає в тому, що ви робите прямий тест проти попередніх n паролів і більш міцний тест на останній пароль. Це компроміс.
Брайан

Так. Якщо їх поточний пароль potatoSalad1і вони хочуть оновити potatoSalad2, ви скажете, що зміна занадто мала, оскільки у вас є обидва текстові паролі на той момент. Але далі, у вас є лише хеші, і природа хешей полягає в тому, що ви не можете сказати, чи два хеші мали аналогічний чи зовсім інший звичайний текст як вхідний.
Натан Лонг

7

щоб додати відповідь до @ martijnPieter, мінімальну зміну можна здійснити, зробивши коротку грубу силу на основі нових та попередніх паролів (які у вас обох є)

наприклад, ви можете переглядати всі паролі з новим паролем на відстані 1 або 2 і побачити, чи відповідає він старому пропуску

але ви можете зауважити, що це може знизити довіру користувачів до того, що ви хешуєте паролі (адже ви, по суті, говорите, можете отримати попередній пароль назад, щоб відхилити новий пароль)


Але є багато послідовностей з більшими відстанями Хеммінга, такі як лютий2012 -> березень2012 або пт-09-28-12 -> вт-11-27-12 (дати), пароль_Альфа -> пароль_бета, Pass_1111 -> Pass_2222, Pass_qwer, Pass_tyui, Передайте, _op [], або Одинадцять -> Дванадцять (альтернативні системи підрахунку), або FrankSmith -> FredJones -> FriarTuck або гнів -> тварина -> яблуко (назви в каталозі компанії або слова в словнику), що зловмисник попередні паролі могли легко здогадатися, але ваш алгоритм створить надзвичайно важкий час.
Кевін Вермер

@KevinVermeer тоді врахуйте ті, хто у вас генератор варіацій, і прийміть, що ви ніколи не отримаєте все
храповик фрік

+1 для зниження довіри. Коли я бачу щось, що говорить мені про те, що мій пароль занадто схожий на той, яким я користувався три місяці тому, я моментально замислююся, чи зберігають вони їх оборотно ... або чи у них є дивовижний програміст. Скептицизм зазвичай перемагає.
Tim Post

5

Це дійсно більше доповнення до розумної відповіді @ Брайана. Капелюхи вимкнено також до @Martijn Pieters для додавання подробиць про те, як жорстоко змусити старі паролі на основі поточного пароля та @ratchet freak для "дистанції забивання". Я не видаляю свою відповідь, тому що думаю, що це дає цікавий фон для їх резервного копіювання.

Сучасне зберігання паролів вимагає використання декількох раундів сильного одностороннього криптографічного хешу (SHA-512 +) з унікальною сіллю (128 біт +) для кожного користувача. Але не спокушайтесь зберігати додаткову інформацію про кожен пароль. Чим більше інформації ви будете зберігати про кожен пароль, тим більше ви підірвете безпеку алгоритму хешування.

Приклад

Поміркуйте, як легко зробити грубу силу, якщо ви знаєте, що:

  • Це 7 символів
  • Символи 3-5 - це великі літери (4 - нижче)
  • 1 і 7 - це числа
  • 6 - символ

Американська клавіатура має 95 символів для друку, тож знаючи, що пароль має 7 символів, виходить 95 ^ 7 = 69 833 729 610 000 = 7x10 ^ 13 перестановок. Якби це було по-справжньому випадковим, може знадобитися рік, щоб зламати це на одному процесорі 3 ГГц. Але:

  • Всього 26 великих регістрів та 26 малих символів
  • Є лише 10 цифр, що дають 100 можливостей для цих двох чисел
  • Усього 32 символи

Отже (виправлено завдяки @Hellion):

         26^4 (charcters 2-5 are known upper or lower-case)
        x 100 (characters 1 & 7 are digits)
        x  32 (character 6 is a symbol)
         ====
1,462,323,200 possible passwords.

Це в 50000 разів простіше зламати! Збереження хорошої інформації для запобігання подібних паролів у цьому випадку зайняло час тріщини для 7-символьного пароля від року до року. Розшифровка всіх ваших паролів на потужному багатопроцесорному робочому столі з хорошою відеокарткою і трохи терпіння зараз дуже здійсненна. Сподіваюся, цей простий приклад демонструє, що чим змістовніше ви можете порівнювати подібні паролі, тим менш безпечним буде ваше хешування.

Важливість сильного хешингу

Бази даних з паролями викрадаються регулярно, з новими щомісяця в новинах. Чорт, тільки минулого місяця штат СК втратив усі номери соціального страхування - ой! Скільки ще цих порушень прикрито?

Заключна думка

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


1
мінорна нитка: можливості пароля все ще мультипликаційні, тому це (26 ^ 4) * 100 * 32 = 1,462,323,200. Якщо припустити, що розтріскування (95 ^ 7) можливостей займає рік, то розкриття цієї меншої кількості можливостей займе близько 11 хвилин.
Гелліон

@Hellion - На жаль! Дякуємо, що вказали на це. Я це виправив.
GlenPeterson

1

По-перше, ви можете зберігати хеші для останніх "n" попередніх паролів, тому ви можете перевірити, чи їх новий пароль дублює попередній пароль. Ви також маєте звичайний текст їх поточного пароля (тому що вони увійшли або надали вам його для підтвердження їх запиту на зміну пароля) та їх новий пароль, тому ви можете перевірити наявність мінімальних змін між цими двома паролями.

Якщо (для вас) дуже важливо безпосередньо порівняти ці два паролі з попередніми "n" паролями, тоді вам потрібно зберегти ці паролі (зашифровані), щоб мати можливість їх отримати згодом.

Хоча це може розглядатися як недолік безпеки для цього, методи шифрування можуть бути реалізовані для забезпечення достатньої безпеки.

  1. Зберігайте кожен пароль (зашифрований) для останніх "n" паролів.
  2. Зберігайте дату та час створення останнього пароля.
  3. Зберігайте хеш самого останнього пароля.
  4. Зашифруйте всі паролі, використовуючи хеш (солоний) поточного пароля та часову позначку створення пароля, а можливо, щось на зразок номера рахунку чи електронної адреси.
  5. Розшифруйте та повторно зашифруйте всі паролі щоразу, коли створюється новий пароль.

Тоді, щоразу, коли пароль буде змінено, ви можете розшифрувати всі старі паролі та зробити всі ваші тести мінімальної зміни.

Тепер, якщо хтось мав пароль цієї людини і знав усі інші необхідні деталі, вони могли б розшифрувати цю інформацію для однієї людини. Але якщо у них вже є пароль цієї особи, вони вже можуть увійти як цю особу та отримати доступ до її облікового запису.

Також для старих паролів вони, можливо, не повинні зберігатись у строго простому тексті. Їх можна було зберігати якимось заплутаним способом. Або зберігається як алфавітний список символів у паролі.

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


Ця відповідь дає кілька жахливих пропозицій щодо безпеки. Ми не повинні мати можливість легко розшифровувати паролі, а також зберігати їх "якимось прихованим способом", а не сильно шифрувати їх.
user45623
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.