In Rails, generalmente si utilizza una libreria preesistente. L'autenticazione è facile da sbagliare e il problema è stato risolto così tante volte che raramente vale la pena risolverlo. Se sei interessato a scrivere la tua implementazione, descriverò come funziona l'autenticazione moderna.
Il metodo ingenuo di autenticazione di un utente consiste nel memorizzare la password in un database e confrontarla con la password che l'utente invia. Questo è semplice ma incredibilmente insicuro. Chiunque sia in grado di leggere il tuo database può visualizzare la password di chiunque. Anche se si inseriscono i controlli di accesso al database, l'utente (e i suoi utenti) sono vulnerabili a chiunque vi si avvicini.
Il modulo corretto consiste nell'utilizzare una funzione di hash crittografica per elaborare la password quando viene scelta e quindi ogni volta che viene inoltrata. Una buona funzione di hash è praticamente irreversibile: non è possibile prendere un hash e trasformarlo in una password. Quindi, quando l'utente esegue il login, si prende la password inviata, l'hash e la si confronta con l'hash nel database. In questo modo, non memorizzi mai la password stessa. Sul lato negativo, se l'utente dimentica la propria password, è necessario ripristinarla invece di inviarla a loro.
Anche questo, tuttavia, è vulnerabile a determinati attacchi. Se un utente malintenzionato si impadronisce degli hash delle password e sa come si hash le tue password, allora può attaccare un dizionario: prende semplicemente ogni parola nel dizionario e blocca quella parola, mantenendola con l'originale. Questa struttura dati è chiamata tabella arcobaleno. Quindi, se uno qualsiasi degli hash delle parole del dizionario corrisponde a un hash della password, l'utente malintenzionato può concludere che la password è la parola del dizionario che esegue il hash su quella password. In breve, un utente malintenzionato in grado di leggere il tuo database può comunque accedere agli account con password deboli.
La soluzione è che prima che una password sia sottoposta a hash, viene combinata (di solito concatenata o xor'd) con un valore chiamato sale che è univoco per ciascun utente. Può essere generato casualmente, o può essere un timestamp di creazione di un account o alcuni di questi. Quindi, un utente malintenzionato non può utilizzare una tabella arcobaleno poiché ogni password viene essenzialmente sottoposta a un hashing leggermente diverso; avrebbe dovuto creare una tabella arcobaleno separata per ogni singolo sale distinto (praticamente per ciascun account), il che sarebbe proibitivo dal punto di vista computazionale.
Risponderemo ai consigli degli altri rispondenti: non si tratta di cose semplici, e non è necessario farlo perché è già stato fatto prima, e se lo fai tu stesso hai ottime possibilità di fare un errore e compromettere inavvertitamente la sicurezza del sistema. Ma se, per una ragione qualsiasi, lo vuoi davvero scrivere davvero tu stesso, spero di aver fornito uno schema (incompleto!) Di come è stato fatto.
Si consiglia di dare un'occhiata a https://github.com/delight-im/PHP-Auth, che è sia agnostic framework e indipendente dal database. – caw