хешування паролів

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

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

В MySQL є три функції для хешування паролів: ENCRYPT (), SHA1 () і MD5Q 1. Щоб подивитися, що вони повертають, найпростіше примі

нитка кожну з них до одного і того ж вхідного тексту. Давайте зробимо це на прикладі рядки p4ssword:

mysql> SELECT MD5 ( 'p4ssword'), ENCRYPT ( 'p4ssword'), SHA1 ( 'p4ssword') \ G

MD5 ( 'p4ssword'): 93863810133ebebe6e4c6bbc2a6ce1e7 ENCRYPT ( 'p4ssword'): dDCjeBzIycENk

Всі три функції повертають рядок букв і цифр фіксованої довжини, яку можна зберегти в стовпці типу CHAR. Оскільки ENCRYPT () може повертати букви в різних регістрах, то краще вказати для стовпця тип CHAR BINARY.

Ніколи не використовуйте в додатках внутрішню функцію MySQL PAS SWO R D (). Повертаються їй результати залежать від версії MySQL.

Для збереження згортки даних досить такої команди:

mysql> INSERT INTO user_table (user, pass) VALUES ( 'user', MD5 ( 'p4ssword'));

Щоб перевірити пароль користувача user, маєте змогу надсилати запити SELECT і перевірити чи збігається згортка зазначеного переданого пароля з тим, що зберігається в базі. Мовою Perl це можна зробити наступним чином:

my $ sth = $ dbh-> prepare ( 'SELECT * FROM user_table'

'WHERE user =. AND pass = MD5 (?) ');

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

my $ sth = $ dbh-> prepare ( 'SELECT * FROM user_table'

'WHERE user =. AND pass = SHA1 (CONCAT (.)) '); $ Sth-> execute ($ username, $ username, $ password):

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

MySQL. оптимізація продуктивності

Схожі статті