Як правильно зберігати паролі своїх користувачів

Як онлайн-сервісам правильно зберігати паролі користувача і як мінімізувати шкоду у разі витоку або злому.

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

У цій статті поговоримо про те, як не варто зберігати паролі користувачів та які методи застосовують сервіси, які серйозно ставляться до безпеки.

Неправильний спосіб: зберігання паролів у відкритому вигляді

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

У цьому випадку є ризик того, що зловмисники зможуть у той чи інший спосіб вкрасти цю базу даних. Наприклад, використання будь-яких вразливостей у використовуваному для зберігання даних ПЗ. Інший варіант – таблицю з паролями може вкрасти недобросовісний співробітник із високим рівнем доступу. Або для крадіжки паролів можуть бути використані вкрадені або перехоплені облікові дані співробітника. Загалом, варіантів того, що може піти не так, тут багато. Головна думка: якщо зберігати якісь дані у відкритому вигляді, на них рано чи пізно хтось може накласти руки.

Спосіб трохи кращий: зашифровані паролі

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

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

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

Правильний спосіб: зберігання хешей паролів

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

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

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

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

У разі витоку бази в руках зловмисників виявляються не самі паролі, а їх хеші, з яких неможливо відновити оригінальні дані (необоротність, пам’ятаєте?). Це набагато менш небезпечно, ніж доступ до паролів у відкритому вигляді, але радіти поки що рано: якщо в руках у злочинців виявилися хеші, то вони можуть використовувати їх для атаки перебором.

Ще правильніший спосіб: солоні хеші

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

Ще гірше те, що насправді процес злому хешованих паролів можна суттєво прискорити: для цього використовуються так звані райдужні таблиці (rainbow tables). Це величезні масиви даних із заздалегідь обчисленими хешами для купи різноманітних комбінацій символів. Відповідно, досить просто шукати збіги між вмістом райдужної таблиці та вкраденої бази. І, звичайно ж, робиться це все не вручну, а автоматизовано, тому процес злому паролів може займати набагато менше часу, ніж усім нам хотілося б.

Плюси rainbow tables

Втім, є і хороша новина: хеші взагалі всіх можливих комбінацій символів заздалегідь обчислити неможливо. Повна райдужна таблиця для будь-якого алгоритму хешування займатиме більше дискового простору, ніж існує на планеті. Скажімо, навіть для не найнадійнішого алгоритму MD5 така гіпотетична таблиця міститиме 340 282 366 920 938 463 463 374 607 431 768 211 456 записів – спробуйте прочитати це число без запинки. Тому в райдужні таблиці потрапляють хеші лише найпоширеніших комбінацій символів.

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

Перед тим як обчислити хеш пароля і записати його в базу, до нього додають випадковий набір символів, який називається сіль (salt). І таким чином записані в базу хеші повністю змінюються – так, що навіть найбільш дурні і часто використовувані паролі на кшталт «12345678» і «password» неможливо зламати за допомогою райдужних таблиць.

У варіанті простіше використовується та сама “сіль” для всіх паролів. А ось у найбільш стійкому до злому – індивідуальні “солі” для кожного окремого запису. Краса підходу в тому, що “солі” можна без особливих проблем зберігати в тій самій базі. Знання “солі” не так сильно спрощує завдання зловмисникам. Для злому їм у будь-якому випадку доведеться використовувати чистий brute force – тобто перебирати всі варіанти.

Чим більше онлайн-сервісів використовує такий варіант незбереження паролів — тим менша ймовірність масової крадіжки облікових даних користувача та подальших неприємностей, пов’язаних із зломом акаунтів.

Веб-сайт використовує файли cookies. Мета — маркетинг і аналіз трафіку. Тут можете дізнатися більше.