![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 012 Pomógł: 109 Dołączył: 26.09.2003 Skąd: nexis.pl Ostrzeżenie: (0%) ![]() ![]() |
Zwykle, dla bezpieczeństwa, trzymamy w bazie danych skrót hasła, utworzony za pomocą md5() bądź sha1(). Z myślą o tęczowych tablicach dopisujemy zwykle dodatkowo tzw. sól, która jest trzymana poza bazą danych, zwykle na serwerze.
Chciałbym jednak zwiększyć bezpieczeństwo również po stronie użytkownika i zastosować mechanizm znany z banków internetowych, czyli odpytywanie użytkownika o wybrane znaki hasła. Aby zastosować taki mechanizm jestem jednak zmuszony zapamiętać każdy znak hasła osobno. Powiedzmy, że w tym celu narzucę maksymalną długość hasła na 16 znaków i stworzę w tabeli bazy danych 16 dodatkowych pól (po 1 dla każdego znaku). Jak ma się jednak w/w sposób do tej sytuacji? Sam skrót to praktycznie żadne zabezpieczenie. Zastosowanie soli już bardziej, ale jest to wciąż bardzo słaby mechanizm. Co zrobić? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 012 Pomógł: 109 Dołączył: 26.09.2003 Skąd: nexis.pl Ostrzeżenie: (0%) ![]() ![]() |
Póki co przyszło mi na myśl stosowanie bardzo złożonej soli, np. 32 znakowej lub wyższej, indywidualnie dla każdego użytkownika. Sól musiałaby być trzymana oczywiście poza bazą danych, np. na serwerze w pliku tekstowym lub w niezależnej bazie danych.
Wtedy mając hasło typu abcd1234 i sól dRazeV!SAkEpe5UquP7udrap6*re3HuG pamiętamy, tak jak poprzednio proponowałem, skrótu dla każdego znaku oddzielnie: adRazeV!SAkEpe5UquP7udrap6*re3HuG bdRazeV!SAkEpe5UquP7udrap6*re3HuG cdRazeV!SAkEpe5UquP7udrap6*re3HuG ddRazeV!SAkEpe5UquP7udrap6*re3HuG 1dRazeV!SAkEpe5UquP7udrap6*re3HuG 2dRazeV!SAkEpe5UquP7udrap6*re3HuG 3dRazeV!SAkEpe5UquP7udrap6*re3HuG 4dRazeV!SAkEpe5UquP7udrap6*re3HuG Można nawet pójść dalej i stosować różną sól dla każdego znaku i użytkownika (n x n). Wtedy mielibyśmy pewność, że ciąg pusty (np. dla hasła 8 znakowego, pozostałe 8 z 16 znaków) miałby różny skrót dla każdego znaku. Masz hasło x znaków, haszujesz każdy znak, hasz ma długość n znaków, czyli całe hasło będzie w bazie zapisane w ciągu o długości x*n znaków. Znak trzeci hasła ma hasz y, hasz y zaczyna się dokładnie po n*2 znaków a kończy dokładnie w miejscu n*4 znaków zahaszowanego hasła w bazie danych. Nie ma problemu. Jedyny ew, problem to to że najpierw użytkownik wysyła login, a dopiero po przeładowaniu strony, czy normalnie, czy ramki ajaxem, poszczególne litery hasła losowo wybrane z tego które jest w bazie. Tak więc jest wyjście. Tylko jeśli ktoś zna budowę tego ciągu, to podzieli sobie ten ciąg na poszczególne znaki, a odczytanie skrótu md5() czy też sha1() z jednoznakowego wyrazu to małe piwo. Ten post edytował nexis 3.09.2009, 20:58:46 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 3.10.2025 - 23:45 |