La respuesta aceptada parece ser proporcionar aceite de serpiente junto con un buen consejo.
Para la generación de tokens CSRF específicamente, solo hay unos pocos requisitos:
- impredecible
- alguna resistencia a la fuerza bruta
- utiliza caracteres imprimibles que son compatibles con la tecnología web
Todo lo que necesitas hacer para lograr esto es generar suficiente aleatoriedad criptográficamente segura para evitar un intento de fuerza bruta modesta (en comparación con, digamos, descifrado de contraseñas fuera de línea) y luego codificarlo por base64.
Puede ver qué utiliza ampliamente la comunidad de Clojure enlace como parte del middleware anti-falsificación (evita el CSRF).
(defn- new-token [] (random/base64 60))
La clave es que la función random/base64
que se llama aquí utiliza la clase criptográficamente segura SecureRandom
bajo el capó. El 60
se refiere a 60 bytes de datos aleatorios para codificar en base64.
Eso es todo.
Puede obtener el mismo resultado si obtiene datos aleatorios de /dev/urandom
.
Aquí hay problemas con las otras sugerencias para el algoritmo de generación de tokens:
- Uso de
mt_rand
: no use esto en absoluto, no es adecuado para este propósito y es exactamente contra lo que advierte el artículo vinculado en la respuesta aceptada (pero luego la respuesta aceptada va) para utilizar mt_rand
en ejemplos de código ...)
- El uso de
uniq_id
: no crea cadenas impredecibles o aleatorias, según los documentos PHP
- Usar una función hash: reduce el conjunto de caracteres, pero no agrega ninguna seguridad. La codificación Base64 es más clara sobre el propósito y no implica una funcionalidad de seguridad que simplemente no existe
- Uso de una clave secreta: en otros contextos, las claves secretas son críticas; en este contexto, simplemente le proporciona algo que debe mantener en secreto (no es algo fácil de hacer), agregando complejidad y dificultad sin beneficios adicionales de seguridad
- añadiendo IP / puerto / etc del cliente. - No hace que el token sea más seguro que los datos cripto-aleatorios, pero sí hace que el algoritmo sea más complicado y menos portátil
- Uso de microtime: no agrega ninguna seguridad adicional, la hora actual es lo suficientemente predecible como para ser forzada. Si consideramos que
mt_rand
es inseguro, seguramente una marca de tiempo también lo es.
Esencialmente, cualquier cosa que haga que agregue complejidad sin cumplir los requisitos fundamentales simplemente hace que el algoritmo:
- Menos mantenible
- Más difícil de entender
- Es más probable que tenga un error crítico
- Menos seguro