W Railsach zazwyczaj korzystano z wcześniej istniejącej biblioteki. Uwierzytelnianie łatwo jest zrobić źle, a problem został rozwiązany tyle razy, że rzadko jest warte wysiłku, aby go rozwiązać ponownie. Jeśli jesteś zainteresowany pisaniem własnych implementacji, opiszę, jak działa nowoczesne uwierzytelnianie.
Naiwną metodą uwierzytelniania użytkownika jest przechowywanie jego hasła w bazie danych i porównywanie go z hasłem przesłanym przez użytkownika. Jest to proste, ale niewiarygodnie niepewne. Każdy, kto może odczytać twoją bazę danych, może wyświetlić hasło każdego. Nawet jeśli zastosujesz kontrolę dostępu do bazy danych, ty (i twoi użytkownicy) jesteście podatni na atak wobec każdego, kto się do nich włamie.
Właściwą formą jest użycie kryptograficznej funkcji skrótu do przetwarzania hasła po wybraniu, a następnie za każdym razem, gdy jest ono przesyłane. Dobra funkcja hashowania jest praktycznie nieodwracalna - nie możesz wziąć hasha i zmienić go z powrotem w hasło. Tak więc, kiedy użytkownik się loguje, bierzesz przedłożone hasło, mieszasz je i porównujesz z hashem w bazie danych. W ten sposób nigdy nie przechowujesz samego hasła. Z drugiej strony, jeśli użytkownik zapomni hasła, należy go zresetować, a nie wysłać do niego.
Nawet to jest jednak podatne na pewne ataki. Jeśli atakujący zdobędzie twoje hasłowe skróty i wie, w jaki sposób mieszasz swoje hasła, może dokonać ataku słownikowego: po prostu bierze każde słowo ze słownika i haszy tego słowa, zachowując je z oryginałem. Ta struktura danych nazywa się tabelą tęczową. Następnie, jeśli dowolne ze skrótów słownikowych pasuje do wartości hash hasła, atakujący może stwierdzić, że hasło jest słownikiem słownikowym, które miesza się z tym hasłem. W skrócie, osoba atakująca, która może odczytać twoją bazę danych, może nadal logować się na konta ze słabymi hasłami.
Rozwiązaniem jest to, że przed hashowaniem hasła jest ono łączone (zwykle łączone lub xor'd) z wartością zwaną solą, która jest unikalna dla każdego użytkownika. Może być losowo generowany lub może być znacznikiem czasu utworzenia konta lub innym. Następnie atakujący nie może korzystać z tabeli tęczowej, ponieważ każde hasło jest w zasadzie nieco inaczej mieszane; musiałby stworzyć oddzielną tęczową tabelę dla każdej odrębnej soli (praktycznie dla każdego konta), która byłaby zaporowo kosztowna obliczeniowo.
Powtórzę radę innych osób udzielających odpowiedzi: nie jest to proste, a nie musisz tego robić, ponieważ zostało to zrobione wcześniej, a jeśli zrobisz to sam, masz bardzo duże szanse na zrobienie błąd i nieumyślne naruszenie bezpieczeństwa twojego systemu. Ale jeśli z jakiegoś powodu naprawdę, naprawdę chcesz napisać samemu, mam nadzieję, że dostarczyłem (niepełny!) Zarys tego, jak to się robi.
Możesz zajrzeć na https://github.com/delight-im/PHP-Auth, który jest zarówno agnostyczny, jak i agnostyczny. – caw