• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed PHP bezpieczeństwo hasła

Object Storage Arubacloud
0 głosów
755 wizyt
pytanie zadane 30 września 2015 w PHP przez event15 Szeryf (93,790 p.)
przywrócone 21 grudnia 2015 przez event15
<?php
$pass = "marek";

$blowfish_salt = bin2hex(openssl_random_pseudo_bytes(128));
$hash = crypt($pass, "$2a$12$".$blowfish_salt);

$input_pass = "marek";
echo $hash . PHP_EOL;

if (crypt($input_pass, $hash) == $hash) {
    echo "OK";
}
else echo "BAD";

Zastanawiam się, czy to wystarczające, czy może ktoś ma ciekawsze rozwiązanie (czyt. bardziej "bezpieczne" :P)

komentarz zamknięcia: efik radzi efik zawsze se poradzi :) (rozwiązane)

3 odpowiedzi

+2 głosów
odpowiedź 30 września 2015 przez efiku Szeryf (75,160 p.)
wybrane 30 września 2015 przez event15
 
Najlepsza
Nie słyszałeś o password hash?  Nie ma sensu kombinować.

Weryfikacja i hashowanie, nic tylko zaimplementować z bazą

https://3v4l.org/CNg5T

Filmik cieakwy: https://www.youtube.com/watch?v=8rIksMdCWkg
komentarz 30 września 2015 przez efiku Szeryf (75,160 p.)
Zachęcam do zobaczenia tego filmiku do końca. ;)
komentarz 30 września 2015 przez efiku Szeryf (75,160 p.)
edycja 30 września 2015 przez efiku

Do bazy polecam zapisywać tak

ID LOGIN HASH EMAIL

W filmie jest powiedziane wszystko odnośnnie unikalnych salt też. Nie wymyślaj ;)

https://3v4l.org/OEpFa

 
<?php
/**
 * Note that the salt here is randomly generated.
 * Never use a static salt or one that is not randomly generated.
 *
 * For the VAST majority of use-cases, let password_hash generate the salt randomly for you
 * 
 */
$options = [
    'cost' => 12,
    'salt' => mcrypt_create_iv(256, MCRYPT_DEV_URANDOM),
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
?>

 

komentarz 30 września 2015 przez event15 Szeryf (93,790 p.)

Deprecated: password_hash(): Use of the 'salt' option to password_hash is deprecated

W PHP7 więc w sumie ok. Masz +1 i naj yes 

komentarz 30 września 2015 przez efiku Szeryf (75,160 p.)
Nie ogarniam tego ckeditor :v zerknij sobie na link do 3v4l teraz https://3v4l.org/OEpFa  :)
0 głosów
odpowiedź 30 września 2015 przez Ehlert Ekspert (212,670 p.)

Ok. A spróbuj jako sól wygenerować "niedrukowalny" ciąg bitów. wink

komentarz 30 września 2015 przez Ehlert Ekspert (212,670 p.)

Czy ta funkcja już to robi... frown

komentarz 30 września 2015 przez event15 Szeryf (93,790 p.)

To znaczy? Bo w sumie nie skumałem co masz na myśli :P

to generuje przykładowo: 

Hash: $2a$12$7c83b13133054b650be40u3cyDBEe5AwVKBKIw7xeRkXT0.Am.mDC Salt: 7c83b13133054b650be409e7b81fadea34aa2c79fb25bd0bf825e1c0383b75e1b072d53e8dd6e5192be75153f0dbed0735b195a5a9bef7486cd7b4488276ff26a18dbdab8a5a926a2d5d45024bc27492f917bd735de9c6fc730c31d2c14a28de9a30aed574e2a6963701dd3c92631cf3d3312342a53714dfd6f1c83764b263b9

komentarz 30 września 2015 przez Ehlert Ekspert (212,670 p.)
Solisz hasło tak? czyli przed jego zakodowaniem dodajesz mu coś.
komentarz 30 września 2015 przez event15 Szeryf (93,790 p.)
Sól generowana jest:  bin2hex(openssl_random_pseudo_bytes(128))

Hashowanie jest tak: crypt($pass, "$2a$12$".$blowfish_salt);

A $2a$12$ oznacza wybór algorytmu i jego koszt
komentarz 30 września 2015 przez Ehlert Ekspert (212,670 p.)
Sól z tej funkcji jest jakimiś bitami z palca wyssanymi?
komentarz 30 września 2015 przez Boshi VIP (100,240 p.)

Nie z palca a z pseudolowych bitów :)

Generates a string of pseudo-random bytes, with the number of bytes determined by the length parameter.

0 głosów
odpowiedź 30 września 2015 przez event15 Szeryf (93,790 p.)

Tak swoją drogą, to jak polecacie to zapisywać w bazie danych?

Najczęściej zapisuje się w postaci:

login password salt

Ale myślałem, żeby zrobić to bardziej w tę stronę, aby zrobić tak jakby dwie sole:

<?php
$pass = "marek";
$random = mt_rand(128, 512); // w php7 random_int();

$database_salt = bin2hex(openssl_random_pseudo_bytes($random));
$program_salt = bin2hex(openssl_random_pseudo_bytes(128));

$hash = crypt($pass, "$2a$12$".$program_salt.$database_salt);

Wtedy $database_salt byłby zapisywany do bazy danych, a $program_salt byłby w kodzie. Wtedy nawet, gdy potencjalny włamywacz posiądzie i salt i hash hasła to nie pomoże mu to zbytnio, bo musiałby znać jeszcze salt programowy.

Przekombinowane? :)

komentarz 30 września 2015 przez event15 Szeryf (93,790 p.)

Ostatecznie chyba zdecydowałem:

<?php

$pass = 'marek';

$database_salt = bin2hex(openssl_random_pseudo_bytes(mt_rand(128, 512)));
$program_salt = bin2hex(openssl_random_pseudo_bytes(128));

// $6$rounds=5000 - base64 
$hash = explode(base64_decode('JDYkcm91bmRzPTUwMDA='), crypt($pass, base64_decode('JDYkcm91bmRzPTUwMDA=').$program_salt.$database_salt))[1];
echo $hash;

A to jak zamierzam to obsługiwać:

$database_salt  jest to sól, która będzie zapisywana w bazie danych, obok loginu, emaila i hasła (hashowanego). Ma ona element losowości. 

$program_salt jest to sól jednokrotnie wygenerowana w kodzie programu. Prawdopodowbnie zapiszę w pliku konfiguracyjnym, który będzie w oddzielnej warstwie aplikacji, niedostępnej dla "szaraków". 

$hash - jest to wygenerowany hash, z tym, że w bazie będzie zapisywany bez części informującej o rodzaju algorytmu i jego ilości przebiegów. Takie dodatkowe utrudnienie. W kodzie ten base64decode będzie zastąpiony, ale ta informacja też będzie niejawna, ponieważ nie zamierzam jej łatwo udostępniać potencjalnemu włamywaczowi :)

komentarz 30 września 2015 przez writen Nałogowiec (29,060 p.)
Nigdy nie można być pewnym czy hasło jest bezpiecznie zahashowane. Teoretycznie jest to proces nieodwracalny. I byle komu nie chciałoby się tym bawić.

Jeśli nie robisz jakiegoś większego systemu, np. dla bankowości, czy jakiegoś sklepu to nie ma się czym przejmować. Funkcja password_hash z solą wystarczy.

Ja też nie ujawniam moich sposobów. U mnie bazę stanowi funkcja password_hash, a inne elementy w kolejnych projektach staram się modyfikować.
komentarz 30 września 2015 przez event15 Szeryf (93,790 p.)

Podobne pytania

+2 głosów
6 odpowiedzi 848 wizyt
pytanie zadane 28 sierpnia 2015 w Offtop przez niezalogowany
0 głosów
0 odpowiedzi 498 wizyt
pytanie zadane 13 stycznia 2017 w PHP przez mo290103 Obywatel (1,860 p.)
+1 głos
1 odpowiedź 252 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...