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.

Author: Mike, 2011-05-04

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 ., /, 09, AZ, az 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) BINARYlub 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.

 311
Author: Gumbo,
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:

  1. $<id>$ może być reprezentowany w 3 bitach.
  2. <cost>$, 04-31, mogą być reprezentowane w 5 bitach. Złóż je razem na 1 bajt.
  3. 22-znakowy salt jest (niestandardową) reprezentacją bazy-64 złożoną z 128 bitów. Baza-64 dekodowanie daje 16 bajtów.
  4. 31-znakowy Skrót skrótu może być dekodowany base - 64 do 23 bajtów.
  5. 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.

 45
Author: Andre D,
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.

 18
Author: Mike,
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

 17
Author: James C,
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