Napisałem mały serwer internetowy, który obecnie używa podstawowego uwierzytelnienia przez ssl. Jak dotąd wszystko działa świetnie. Teraz chcę (trzeba) przełączyć się na auth. Ale nie mogę wymyślić, jak to zrobić z hasłami, które nie są przechowywane w bazie danych jako tekst jawny? Mam tylko skrót hasła (wygenerowany przy użyciu bcrypt) przechowywanych haseł moich użytkowników. Czy w ogóle możliwe jest automatyczne trawienie http?Zaszyfrowane hasło w bazie danych i wyciągu z przeglądarki Auth
Odpowiedz
Właśnie się nad tym zastanawiałem. Najpierw przeczytałem RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication, aby uzyskać wgląd w specyfikację i zobaczyć, jak można ją zaadaptować do uwierzytelniania API REST.
Zrobiłeś to samo, co Ty - Czy uwierzytelnianie trawienne oznacza, że serwer musi przechowywać hasło użytkownika w postaci zwykłego tekstu?
This przepełnienie stosu odpowiedź jasno: nr Serwer nie przechowywać tekstu jawnego hasła - it should store the hash of (username|realm|password)
.
Byłoby dobrze, z wyjątkiem jednej rzeczy - kanoniczna specyfikacja obsługuje tylko używanie MD5 jako funkcji skrótu.
Oczywiście można przechowywać zarówno hash bcrypt i hash MD5 ale robi tak tylko zagraża bezpieczeństwu hash bcrypt skutecznie czyniąc go bezużytecznym (ponieważ atakujący może przesunąć swoje wysiłki na brute zmusza hash MD5 zamiast).
Więc zrobiła krok do tyłu i pomyślałem, dlaczego nie lekceważyć spec i używać bcrypt na obu stronach jako funkcji mieszającej (bcrypt(username|realm|password)
)?
Cóż, oprócz celowego powolnego, bcrypt has a maximum password length który makes it unsuitable for use as a general digest algorithm.
Uff, moja głowa już płynęła, ale wciąż myślałem, że jeszcze raz. Niektóre z sugestii dotyczyły używania TLS z SRP lub uwierzytelnionego szyfrowania, w szczególności EAX, ale czułem, że być może robili to o krok za daleko, aby uzyskać prostą usługę sieciową.
Mówiąc prościej, jeśli naprawdę chcesz to zrobić, możesz work around bcrypt's character limitation by using a preliminary hash.
Krótko mówiąc wydaje się, że można zrobić:
bcrypt(sha256(username|realm|password))
i używać zamiast H(A1)
w bastardized wersji spec.
Nasuwa się teraz pytanie - czy naprawdę warto było dodać tę złożoność? Czy otrzymaliśmy dodatkową warstwę zabezpieczeń w porównaniu z podstawowym uwierzytelnieniem przez HTTPS?
Długo po wydarzeniu wiem, ale fantastyczne wyjaśnienie - generalnie unikam komentarzy "dziękuję" za kierownicą, ale to naprawdę pomogło mi zrozumieć ograniczenia trawienia auth :) – ChrisV