Jakiego typu/długości kolumny należy użyć do przechowywania hashowanego hasła Bcrypt w bazie danych?
Chcę zapisać hashowane hasło (używając BCrypt) w bazie danych. Co byłoby dobrym typem do tego, a która byłaby prawidłowa długość? Czy hasła zaszyfrowane Bcryptem są zawsze tej samej długości?
EDIT
Przykładowy hash:
$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu
Po zaszyfrowaniu niektórych haseł, wydaje się, że BCrypt zawsze generuje 60 znaków.
EDIT 2
Przepraszam, że nie wspomniałem o implementacji. Używam jBCrypt.
4 answers
Modularny format kryptograficzny dla bcrypt składa się z
-
$2$
,$2a$
lub$2y$
identyfikowanie algorytmu hashującego i formatu - dwucyfrowa wartość oznaczająca parametr koszt, po którym następuje
$
- Baza o długości 53 znaków-64-zakodowana wartość (używają alfabetu
.
,/
,0
–9
,A
–Z
,a
–z
różni się od standard Base 64 Encoding alphabet) składającego się z:- 22 znaki soli (efektywnie tylko 128 bitów ze 132 zdekodowanych bitów)
- 31 znaków zaszyfrowanego wyjścia (efektywnie tylko 184 bity ze 186 zdekodowanych bitów)
Zatem całkowita długość wynosi odpowiednio 59 lub 60 bajtów.
Gdy używasz formatu 2a, potrzebujesz 60 bajtów. I tak dla MySQL polecam skorzystanie z CHAR(60) BINARY
lub BINARY(60)
(zobacz _bini binarne zestawienia aby uzyskać informacje o różnica).
CHAR
nie jest Bezpieczna binarnie, a równość nie zależy wyłącznie od wartości bajtu, ale od rzeczywistego zestawienia; w najgorszym przypadku A
jest traktowana jako równa a
. Zobacz _bin
i binary
} Kolacje aby uzyskać więcej informacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-08 15:34:40
Skrót Bcrypt może być przechowywany w kolumnie BINARY(40)
.
BINARY(60)
, jak sugerują inne odpowiedzi, jest to najłatwiejszy i najbardziej naturalny wybór, ale jeśli chcesz zmaksymalizować wydajność pamięci masowej, możesz zapisać 20 bajtów, bezstratnie dekonstruując hash. Udokumentowałem to dokładniej na Githubie: https://github.com/ademarre/binary-mcf
Skróty Bcrypt są zgodne ze strukturą zwaną modular crypt format (MCF). binarny MCF (BMCF) dekoduje ten tekstowy hash reprezentacje do bardziej zwartej struktury binarnej. W przypadku Bcrypt uzyskany binarny hash wynosi 40 bajtów.
Gumbo zrobił dobrą robotę wyjaśniając cztery składniki bcrypt MCF hash:
$<id>$<cost>$<salt><digest>
Dekodowanie do BMCF wygląda tak:
-
$<id>$
może być reprezentowany w 3 bitach. -
<cost>$
, 04-31, mogą być reprezentowane w 5 bitach. Złóż je razem na 1 bajt. - 22-znakowy salt jest (niestandardową) reprezentacją bazy-64 złożoną z 128 bitów. Baza-64 dekodowanie daje 16 bajtów.
- 31-znakowy Skrót skrótu może być dekodowany base - 64 do 23 bajtów.
- Połącz to wszystko na 40 bajtów:
1 + 16 + 23
Możesz przeczytać więcej pod linkiem powyżej, lub sprawdzić moją implementację PHP , również na Githubie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-29 23:20:39
Jeśli używasz PHP ' S password_hash()
W przypadku algorytmu PASSWORD_DEFAULT
generującego hash bcrypt (który zakładam, że jest dużym odsetkiem osób czytających to pytanie) pamiętaj, że w przyszłości password_hash()
może użyć innego algorytmu jako domyślnego i może to mieć wpływ na długość hasha (ale niekoniecznie musi być dłuższy).
Ze strony podręcznika:
Zauważ, że stała ta ma zmieniać się w czasie jako nowa i silniejszy algorytmy są dodawane do PHP. Z tego powodu długość wynik korzystania z tego identyfikatora może się zmieniać w czasie. Dlatego, zaleca się przechowywanie wyniku w kolumnie bazy danych, która może rozwiń poza 60 znaków (dobrym wyborem byłoby 255 znaków).
Używając bcrypt, nawet jeśli masz 1 miliard użytkowników (tj. aktualnie konkurujesz z facebook) do przechowywania 255 bajtowych hashów haseł, to tylko ~255 GB danych - o wielkości małego dysku SSD dysk twardy. Jest bardzo mało prawdopodobne, że przechowywanie hash hasła będzie wąskim gardłem w Twojej aplikacji. Jednak w przypadku braku możliwości, że Miejsce Pamięci rzeczywiście jest problemem z jakiegoś powodu, możesz użyć PASSWORD_BCRYPT
, aby wymusić password_hash()
użycie bcrypt, nawet jeśli nie jest to domyślne. Pamiętaj tylko, aby być na bieżąco z lukami w zabezpieczeniach znajdującymi się w bcrypt i przejrzyj uwagi do wydania za każdym razem, gdy nowa wersja PHP zostanie wydana. Jeśli domyślny algorytm zostanie kiedykolwiek zmieniony, dobrze byłoby sprawdź dlaczego i podejmij świadomą decyzję, czy użyć nowego algorytmu, czy nie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-20 21:44:34
Myślę, że nie ma żadnych fajnych sztuczek, które można zrobić przechowując to, jak można zrobić na przykład z hash MD5.
Myślę, że najlepiej będzie zapisać go jako CHAR(60)
, ponieważ zawsze ma 60 znaków
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-04 09:38:23