La risposta accettata sembra fornire olio di serpente insieme a buoni consigli.
Per la generazione di token CSRF in particolare, ci sono solo alcuni requisiti:
- imprevedibile
- una certa resistenza alla forza bruta
- utilizza caratteri stampabili compatibili con la tecnologia web
Tutto ciò che devi fare per ottenere questo è generare abbastanza casualità crittograficamente sicuro per evitare un modesto tentativo di forza bruta (rispetto, ad esempio, al crack delle password offline) e poi codificare Base64.
Puoi vedere ciò che viene ampiamente utilizzato dalla comunità Clojure link come parte del middleware anti-contraffazione (impedisce CSRF).
(defn- new-token [] (random/base64 60))
La chiave è che la funzione random/base64
che viene chiamata qui utilizza la classe Java SecureRandom
crittograficamente protetta sotto il cofano. Il 60
si riferisce a 60 byte di dati casuali da codificare Base64.
Questo è tutto.
Puoi ottenere lo stesso risultato procurando dati casuali da /dev/urandom
.
Qui ci sono problemi con gli altri suggerimenti per l'algoritmo di generazione di token:
- Uso di
mt_rand
- non usare affatto questo, non è adatto allo scopo qui ed è esattamente ciò che l'articolo collegato nella risposta accettata mette in guardia (ma poi la risposta accettata va per utilizzare mt_rand
negli esempi di codice ...)
- Uso di
uniq_id
- non crea stringhe imprevedibili o casuali, come per i documenti PHP
- Usando una funzione di hash - riduce il set di caratteri, ma non aggiunge alcuna sicurezza. La codifica Base64 è più chiara sullo scopo e non implica funzionalità di sicurezza che semplicemente non sono presenti
- Uso di una chiave segreta - In altri contesti le chiavi segrete sono fondamentali, in questo contesto ti forniscono semplicemente qualcosa che devi tenere segreto (non è una cosa facile da fare), aggiungendo complessità e difficoltà senza alcun vantaggio extra di sicurezza
- aggiunta di IP client / porta / ecc. - Non rende il token più sicuro dei dati crittografici casuali, ma rende l'algoritmo più complicato e meno portabile
- Uso del microtime - Non aggiunge alcuna sicurezza aggiuntiva, l'ora corrente è abbastanza prevedibile da essere forzata bruta. Se consideriamo
mt_rand
insicuro, sicuramente anche un timestamp.
In sostanza, qualsiasi cosa tu faccia che aggiunge complessità senza soddisfare i requisiti fondamentali, rende solo l'algoritmo:
- Meno gestibili
- Più difficile da capire
- Più probabile che abbia un bug critico
- Meno sicuro