Хеширане в PHP

Аватар
terrorsecurity.tech
Извън линия
Потребител
Потребител
Мнения: 126
Регистриран на: 15 Фев 2017, 21:53
Получена благодарност: 9 пъти

Хеширане в PHP

Мнение от terrorsecurity.tech » 16 Фев 2018, 11:49

Повечето съвременни PHP приложения, работещи с важна информация и/или онлайн магазини съхраняват потребителски имена и пароли в базата данни.

Винаги трябва да се мисли за сигурност. Ако паролите се съхраняват в обикновен текст, какво би се случило, ако някой нерегламентирано получи достъп до база данните? Той лесно може да чете всички пароли на потребителите. Ето защо се използва техниката, наречена хеширане на пароли, за да се предотврати получаването на потребителските пароли.
Забележка: Хеширането на пароли пак не е сигурен начин, че паролата няма да бъде дехеширана.

В тази статия ще научите как да съхранявате пароли сигурно в база данни, така че дори, ако вашата база данни попада в неподходящи ръце, няма такава голяма опастност от загуби, кражба на пари и други.

Как хеширане в PHP?

- Има различни алгоритми за генериране на хеш на текста. Най-популярните от тях са: MD5, SHA1 и Bcrypt (Blowfish). Всеки от тези алгоритми поддържа PHP.

Нека да започнем с md5() PHP функция, която хешира паролата в съответствие с хеширане на алгоритъм MD5, който съдържа 32 символа, знака, букви и/или цифри, както щете го наречете. Следният пример илюстрира процеса на регистрация:

Код за потвърждение: Избери целия код

$potrebitel = $_POST["potrebitel"];
$parola = $_POST["parola"];
// създаване на връзка към MySQL
// ...
// обработка на формите
// ...
// създаване на MD5 хеш на паролата
$parola = md5($parola);
// запазване на информацията в MySQL
$sql = "INSERT INTO users (potrebitel, parola) VALUES (:potrebitel, :parola)";
$terrorsec = $db->prepare($sql);
$terrorsec->execute(array(
    ":potrebitel" => $potrebitel,
    ":parola" => $parola
));
Следващият пример показва процеса на вход:

Код за потвърждение: Избери целия код

$potrebitel = $_POST["potrebitel"];
$parola = $_POST["parola"];
// създаване на връзка към MySQL
// ...
// обработка на формите
// ...
// създаване на MD5 хеш на паролата
$parola = md5($parola);
// извличане на информация от базата данни
$sql = "SELECT * FROM users WHERE potrebitel=:potrebitel AND parola=:parola";
$terrorsec = $db--->prepare($sql);
$terrorsec->execute(array(
    ":potrebitel" => $potrebitel,
    ":parola" => $parola
));
$row = $terrorsec->fetch();
В примера по-горе, md5() създава 128-битов хеш на тази парола. Също така е възможно да се използва sha1(), вместо MD5(), която произвежда 160-битов хеш, (което означава, че има по-малка вероятност от сблъсък).
Ако генерирате MD5 хеш на низ "moqtaparola", то тогава ще изглежда по следния начин:
842601d4f3deec4fdb352bfc060e40e8
А "moqtaparola" в SHA1 вид ще изглежда по следният начин:
3628fdc41f289033fec89bdb6b57c8187ea08d81
Никога не прехеширайте парола по два или повече пъти. Това не прибавя допълнителна сигурност, а по-скоро прави хеша слаб и неефективен. Например, не се опитвайте да създадете MD5 хеш на паролата, а след това го обърнете към sha1() (това е груба грешка).

Изследователите открили няколко слабости в SHA1 и MD5. Ето защо съвременните PHP приложения, не трябва да използват тези две хеш функции. Вместо това, те трябва да използват хеш алгоритми SHA2, SHA256 или sha512. Както подсказва името, те произвеждат хеш с дължина от 256 и 512 бита. Те са нови и много по-силни, сравнени с MD5. С увеличаване на броя на битовете, вероятността за атака намалява. Всяка от двете е повече от достатъчна, за да се гарантира вашата сигурност.

Следният код показва как да използвате SHA256 в PHP:

Код за потвърждение: Избери целия код

$parola = hash("sha256", $parola);
Параноята е добър порок - Използвайте salt за допълнителна сигурност

Параноята за сигурността на вашата система е добър порок, така че, нека да разгледаме този случай. В случая функцията хешира потребителската парола и я съхранява в таблица на база данни. Дори ако някой получави достъп до вашата база данни, тя няма да бъде в състояние да определи първоначалната парола. Но какво се случва, ако въпросният сравни всички хешове на паролите един с друг, и някой от тях са едни и същи? Какво означава това? Това означава, че паролите на тези потребителски акаунти са едни и същи.

Решението е да използвате произволен брой в генерирането на хеш нарича сол. Всеки път, когато се генерира хеш на паролата, ние използваме случаен сол. Ти просто трябва да се генерират случайни числа на определен период и да го добавите към обикновен текстов парола, и след това да го хеш. По този начин, дори ако двете пароли за сметките и генерира хеш не е същото, защото солите, използвани в двата случая са различни.

Следният код показва използването на salt функция:

Код за потвърждение: Избери целия код

define("MAX_LENGTH", 5);
function generiranenahashssalt($parola) {
    $mejdinenSalt = md5(uniqid(rand(), true));
    $salt = substr($mejdinenSalt, 0, MAX_LENGTH);
    return hash("sha256", $parola . $salt);
}
Исползване на BCrypt
Bcrypt техниката на хеширане е възможно най-сигурният начин.

Код за потвърждение: Избери целия код

function generiranenahesh($parola) {
    if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
        $salt = '$15y$26$' . substr(md5(uniqid(rand(), true)), 0, 30);
        return crypt($parola, $salt);
    }
}
Ако ще копирате, то в такъв случай добавете автор. : P

Аватар
dunix
Извън линия
Потребител
Потребител
Мнения: 6
Регистриран на: 13 Фев 2018, 17:31
Местоположение: София
Обратна връзка:

Хеширане в PHP

Мнение от dunix » 16 Фев 2018, 13:12

Харесва ми обяснението!
Хубаво ще е да добавиш урок в който се регистрираш, взимаш тази част и я ползваш за вход и следващи страници. На много начинаещи, ще е полезно. :)

Аватар
terrorsecurity.tech
Извън линия
Потребител
Потребител
Мнения: 126
Регистриран на: 15 Фев 2017, 21:53
Получена благодарност: 9 пъти

Хеширане в PHP

Мнение от terrorsecurity.tech » 16 Фев 2018, 13:17

dunix написа: 16 Фев 2018, 13:12 Харесва ми обяснението!
Хубаво ще е да добавиш урок в който се регистрираш, взимаш тази част и я ползваш за вход и следващи страници. На много начинаещи, ще е полезно. :)
Видео урок ли имаш предвид?

Аватар
dunix
Извън линия
Потребител
Потребител
Мнения: 6
Регистриран на: 13 Фев 2018, 17:31
Местоположение: София
Обратна връзка:

Хеширане в PHP

Мнение от dunix » 16 Фев 2018, 13:29

Не видео урок, а примерен код за регистрационна форма (reg.php), форма за вход (login.php) и начална страница (index.php) в която да проверяваш когато потребителя е вътре да изписва нещо и когато не е вътре изписва съобщение да влезе в системата.

Аватар
terrorsecurity.tech
Извън линия
Потребител
Потребител
Мнения: 126
Регистриран на: 15 Фев 2017, 21:53
Получена благодарност: 9 пъти

Хеширане в PHP

Мнение от terrorsecurity.tech » 16 Фев 2018, 19:36

dunix написа: 16 Фев 2018, 13:29 Не видео урок, а примерен код за регистрационна форма (reg.php), форма за вход (login.php) и начална страница (index.php) в която да проверяваш когато потребителя е вътре да изписва нещо и когато не е вътре изписва съобщение да влезе в системата.
Няма проблем, имаш ги, но не и тук, а в сайта ми, който е описан в подписа ми.
Тук влизам много рядко по принцип, така и ще си остане, така че ако имаш въпроси, просто ми пиши през контактната форма в сайта.

Аватар
sianbg
Извън линия
Потребител
Потребител
Мнения: 232
Регистриран на: 13 Ное 2017, 12:18
Получена благодарност: 1 път
Обратна връзка:

Хеширане в PHP

Мнение от sianbg » 17 Фев 2018, 11:24

Съгласен съм да се ползва salt, но няма много смисъл за паролата на потребителя. Нали този salt ще го запишеш в базата и, ако те ударят пак имат 20% от хеша. Salt се добавя за бисквитката на потребителя с, която ще се идентифицира. Много по-лесно е да brute force бисквтика от колкото login-a с име и парола. При логин можеш да хванеш потребителя и да му сложиш лимит на опитите за логин. То и при бисквитката може, ама няма да е толкова сигурно.Само да кажа, че sha256 също отдавна не е сигурна :)

Аватар
terrorsecurity.tech
Извън линия
Потребител
Потребител
Мнения: 126
Регистриран на: 15 Фев 2017, 21:53
Получена благодарност: 9 пъти

Хеширане в PHP

Мнение от terrorsecurity.tech » 17 Фев 2018, 11:34

sianbg написа: 17 Фев 2018, 11:24 Съгласен съм да се ползва salt, но няма много смисъл за паролата на потребителя. Нали този salt ще го запишеш в базата и, ако те ударят пак имат 20% от хеша. Salt се добавя за бисквитката на потребителя с, която ще се идентифицира. Много по-лесно е да brute force бисквтика от колкото login-a с име и парола. При логин можеш да хванеш потребителя и да му сложиш лимит на опитите за логин. То и при бисквитката може, ама няма да е толкова сигурно.Само да кажа, че sha256 също отдавна не е сигурна :)
Между salt за парола в база данни и salt на сесия в интернет има разлика.
Или имат целият хеш или нищо. :)
Ако имат само хеш, но нямат salt да не кажа невъзможно, но много трудно ще декриптират паролата, с каквото и да се тества. Същото важи и за случай, в който имат само salt без хеш - реално нямат нищо.
Ако използвам парола от сорта на oewo(@(@(#;::EWLELWKellkWEKLWKLEKLW надявам се да успееш да я уцелиш с брут атака, може би след 30 години ще се получи. :)
Всеки криптиращ алгоритъм е силен, но ако човек ползва пароли от сорта на 123456, нормално защитата да е "хлабава".

Аватар
sianbg
Извън линия
Потребител
Потребител
Мнения: 232
Регистриран на: 13 Ное 2017, 12:18
Получена благодарност: 1 път
Обратна връзка:

Хеширане в PHP

Мнение от sianbg » 17 Фев 2018, 11:44

salt-a на паролата все пак трябва да го запишеш, освен, ако не е статичен. За сесията използвам напълно random хеш. Винаги ще зависи от паролата на потребителя, но мисълта ми е, че ако ти вземат базата, salt-a за паролата няма да помогне много.

Всичко е въпрос на хардуер в криптацията. Разработва се квантов компютър и реално такъв хеш ще го пробие за 2 секунди.

Аватар
terrorsecurity.tech
Извън линия
Потребител
Потребител
Мнения: 126
Регистриран на: 15 Фев 2017, 21:53
Получена благодарност: 9 пъти

Хеширане в PHP

Мнение от terrorsecurity.tech » 17 Фев 2018, 11:52

Не смятам повече да ти отговорям, защото ме загуби с глупостта, която написа и ще оставя нещата както ти си си ги набил в мозъка. = )
sianbg написа: 17 Фев 2018, 11:44 Всичко е въпрос на хардуер в криптацията. Разработва се квантов компютър и реално такъв хеш ще го пробие за 2 секунди.
Изображение

Аватар
sianbg
Извън линия
Потребител
Потребител
Мнения: 232
Регистриран на: 13 Ное 2017, 12:18
Получена благодарност: 1 път
Обратна връзка:

Хеширане в PHP

Мнение от sianbg » 17 Фев 2018, 12:02

terrorsecurity.tech написа: 17 Фев 2018, 11:52 Не смятам повече да ти отговорям, защото ме загуби с глупостта, която написа и ще оставя нещата както ти си си ги набил в мозъка. = )
sianbg написа: 17 Фев 2018, 11:44 Всичко е въпрос на хардуер в криптацията. Разработва се квантов компютър и реално такъв хеш ще го пробие за 2 секунди.
Изображение
К'во ми излизаш с някаква статистика и се мислиш, че е голям аргумент. Хардуера за теб няма разлика ли ? Личи си, че си просто на теория и на практика нищо не си правил. Просто спирам да се хабя наистина. Една парола може да бъде разбира за 20 мин или за 20 години. Всичко е относително. Ти си от тези хора, които си мислят, че всичко знаят :D Точно с това ли съм те изгубил ? Понеже не знаеш какво ще стане с днешните крипто алгоритми, когато се появи ...

Публикувай отговор

Обратно към “Уроци”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта