Jakiego typu danych użyć dla pola hashed password i jakiej długości?

Nie jestem pewien, jak działa haszowanie haseł( zaimplementuje je później), ale muszę teraz utworzyć schemat bazy danych.

Myślę o ograniczeniu haseł do 4-20 znaków, ale jak rozumiem po zaszyfrowaniu hash string będzie różnej długości.

Jak przechowywać te hasła w bazie danych?

Author: jww, 2008-10-29

9 answers

To zależy od algorytmu haszującego, którego używasz. Hashowanie zawsze daje wynik o tej samej długości, niezależnie od danych wejściowych. Typowe jest reprezentowanie binarnego wyniku skrótu w tekście, jako serii cyfr szesnastkowych. Lub możesz użyć UNHEX() funkcja zmniejszania ciągu cyfr sześciokątnych o połowę.

  • MD5 generuje 128-bitową wartość skrótu. Możesz użyć CHAR(32) lub BINARY (16)
  • SHA-1 generuje 160-bitową wartość skrótu. Można użyć CHAR(40) lub BINARY(20)
  • SHA-224 generuje 224-bitową wartość skrótu. Możesz użyć CHAR(56) lub BINARY (28)
  • SHA-256 generuje 256-bitową wartość skrótu. Można użyć CHAR(64) lub BINARY (32)
  • SHA-384 generuje 384-bitową wartość skrótu. Możesz użyć CHAR (96) lub BINARY(48)
  • SHA-512 generuje 512-bitową wartość skrótu. Możesz użyć CHAR(128) lub BINARY (64)
  • BCrypt generuje zależną od implementacji 448-bitową wartość skrótu. możesz potrzebować CHAR(56), CHAR(60), CHAR(76), BINARY(56) lub BINARY(60)

NIST zaleca stosowanie SHA-256 lub wyższej dla haseł. Mniejsze algorytmy haszujące mają swoje zastosowania, ale są one znane z możliwości złamania .

Powinieneś posolić swoje hasła przed zastosowaniem funkcji haszującej. Zasolenie hasła nie wpływa na długość wyniku skrótu.

 409
Author: Bill Karwin,
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
2017-05-23 12:34:30

Możesz użyć CHAR(length of hash), aby zdefiniować swój typ danych dla MySQL, ponieważ każdy algorytm haszujący zawsze będzie obliczał tę samą liczbę znaków. Na przykład, SHA1 zawsze zwraca 40-znakową liczbę szesnastkową.

 15
Author: Noah Goodrich,
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
2008-10-29 15:53:24

Jako łańcuch o stałej długości (VARCHAR(n) lub jakkolwiek nazywa to MySQL). Hash ma zawsze stałą długość, na przykład 12 znaków (w zależności od używanego algorytmu hashowego). Tak więc 20-znakowe hasło zostanie zredukowane do 12-znakowego hasha, a 4-znakowe hasło również da 12-znakowy hash.

 8
Author: Treb,
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
2008-10-29 15:47:20

Ten artykuł na Wikipedii o soleniu jest wart uwagi . Chodzi o to, aby dodać określony bit danych w celu losowej wartości skrótu; to ochroni Twoje hasła przed atakami słownikowymi, jeśli ktoś uzyska nieautoryzowany dostęp do hashów hasła.

 8
Author: Dana the Sane,
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
2008-10-29 15:50:12

Hasze są sekwencją bitów (128 bitów, 160 bitów, 256 bitów itd., w zależności od algorytmu). Jeśli MySQL na to pozwala (typ danych serwera SQL to binary(n) LUB varbinary(n)), twoja kolumna powinna być wpisywana binarnie, a nie tekstowo. Powinieneś także posolić hasze. Sole mogą być tekstowe lub binarne i będziesz potrzebował odpowiedniej kolumny.

 3
Author: yfeldblum,
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
2008-10-29 15:59:51

To naprawdę zależy od algorytmu haszującego, którego używasz. Długość hasła ma niewiele wspólnego z długością hasha, o ile dobrze pamiętam. Sprawdź specyfikacje algorytmu haszującego, którego używasz, wykonaj kilka testów i obcinaj tuż powyżej.

 2
Author: willasaywhat,
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
2008-10-29 15:54:33

Dla md5 VARCHAR (32) jest odpowiedni. Dla tych, którzy używają AES lepiej użyć varbinary.

 2
Author: Hare Srinivasa,
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
2010-05-29 07:05:52

Zawsze testowałem, aby znaleźć maksymalną długość łańcucha zaszyfrowanego i ustawić ją jako długość znaku typu VARCHAR. W zależności od tego, ile rekordów będziesz miał, może to naprawdę pomóc w rozmiarze bazy danych.

 1
Author: Stephen Walcher,
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
2008-10-29 15:48:06

Powinieneś użyć TEXT (przechowując nieograniczoną liczbę znaków) ze względu na kompatybilność do przodu. Algorytmy haszujące (muszą) z czasem stają się silniejsze i dlatego to pole bazy danych będzie musiało obsługiwać więcej znaków w czasie. Dodatkowo w zależności od strategii migracji może być konieczne przechowywanie nowych i starych skrótów w tym samym polu, dlatego nie zaleca się ustalania długości do jednego rodzaju skrótu.

 1
Author: bart,
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
2017-07-25 22:32:03