Chcę przechowywać hashowane hasło (za pomocą BCrypt) w bazie danych. Jaki byłby do tego dobry typ i która miałaby odpowiednią długość? Czy hasła mieszane z BCrypt są zawsze tej samej długości?
EDYTOWAĆ
Przykładowy skrót:
$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu
Po haszowaniu niektórych haseł wydaje się, że BCrypt zawsze generuje 60 znaków haszowania.
EDYCJA 2
Przepraszamy za brak wzmianki o implementacji. Używam jBCrypt .
Odpowiedzi:
Modułowy format krypt dla bcrypt składa się z
$2$
,$2a$
Lub$2y$
identyfikacji algorytmu i format mieszającego$
.
,/
,0
-9
,A
-Z
,a
-z
, która różni się od standardowej podstawy 64 Kodowanie alfabetu) składający się z:Zatem całkowita długość wynosi odpowiednio 59 lub 60 bajtów.
Podczas korzystania z formatu 2a potrzebujesz 60 bajtów. A tym samym dla MySQL Ja polecam używać
CHAR(60) BINARY
lubBINARY(60)
(patrz The _bin i binarnych sortowania w celu uzyskania informacji na temat różnicy).CHAR
nie jest binarnie bezpieczny, a równość nie zależy wyłącznie od wartości bajtów, ale od faktycznego zestawienia; w najgorszym przypadkuA
jest traktowany jako równya
. Aby uzyskać więcej informacji, zobacz The_bin
andbinary
Collations .źródło
SQL_Latin1_General_CP1_CS_AS
jest nieznany w MySQL. To, co jest znane, tolatin1_general_cs
.2
,2a
i2y
średnią dla algorytmu i formatu mieszający. Nie mogłem znaleźć prostej odpowiedzi przy wyszukiwaniu.Hash Bcrypt może być przechowywany w
BINARY(40)
kolumnie.BINARY(60)
, jak sugerują inne odpowiedzi, jest najłatwiejszym i najbardziej naturalnym wyborem, ale jeśli chcesz zmaksymalizować wydajność pamięci, możesz zaoszczędzić 20 bajtów, bezstratnie dekodując skrót. Udokumentowałem to dokładniej na GitHub: https://github.com/ademarre/binary-mcfSkróty Bcrypt mają strukturę określaną jako modułowy format krypt (MCF). Binarny MCF (BMCF) dekoduje te tekstowe reprezentacje skrótów do bardziej zwartej struktury binarnej. W przypadku Bcrypt wynikowy hasz binarny ma 40 bajtów.
Gumbo wykonał niezłą robotę, wyjaśniając cztery składniki skrótu Bcrypt MCF:
Dekodowanie do BMCF wygląda następująco:
$<id>$
może być reprezentowany w 3 bitach.<cost>$
, 04-31, można przedstawić w 5 bitach. Połącz je razem dla 1 bajtu.1 + 16 + 23
Możesz przeczytać więcej na powyższy link lub sprawdzić moją implementację PHP , także na GitHub.
źródło
Jeśli używasz PHP
password_hash()
zPASSWORD_DEFAULT
algorytmem do generowania skrótu bcrypt (który, jak zakładam, stanowi duży procent osób czytających to pytanie), pamiętaj, że w przyszłościpassword_hash()
może używać innego algorytmu jako domyślnego, a zatem może to wpływa na długość skrótu (ale niekoniecznie musi być dłuższy).Ze strony podręcznika:
Używając bcrypt, nawet jeśli masz 1 miliard użytkowników (tzn. Obecnie konkurujesz z Facebookiem) do przechowywania 255 bajtów skrótów haseł, to tylko ~ 255 GB danych - mniej więcej wielkości małego dysku twardego SSD. Jest bardzo mało prawdopodobne, aby przechowywanie skrótu hasła było wąskim gardłem w Twojej aplikacji. Jednak nie jest prawdopodobne, że przestrzeń dyskowa jest z jakiegoś powodu problemem, możesz użyć
PASSWORD_BCRYPT
siły,password_hash()
aby użyć bcrypt, nawet jeśli nie jest to domyślne. Pamiętaj tylko, aby być informowanym o wszelkich lukach wykrytych w bcrypt i przeglądać informacje o wydaniu za każdym razem, gdy nowa wersja PHP jest wydawana. Jeśli domyślny algorytm zostanie kiedykolwiek zmieniony, dobrze byłoby sprawdzić powód i podjąć świadomą decyzję, czy użyć nowego algorytmu, czy nie.źródło
Nie wydaje mi się, aby istniały jakieś fajne sztuczki, które można zrobić, przechowując to, jak na przykład za pomocą skrótu MD5.
Myślę, że najlepszym rozwiązaniem jest przechowywanie go w postaci
CHAR(60)
60 znakówźródło