Editar: esta respuesta se basa en django 1.5
SECRET_KEY
se usa en muchos lugares diferentes, primero señalaré lo que se ve afectado y luego intentaré repasar esa lista y dar una explicación precisa del impacto.
La lista de cosas usando SECRET_KEY
directa o indirectamente:
En realidad, muchos de los elementos enumerados aquí usan a SECRET_KEY
través del django.utils.crypt.get_random_string()
cual se usa para sembrar el motor aleatorio. Esto no se verá afectado por un cambio en el valor de SECRET_KEY
.
La experiencia del usuario directamente afectada por un cambio de valor son:
- sesiones, la decodificación de datos se interrumpirá, eso es válido para cualquier backend de sesión (cookies, base de datos, archivo o caché).
- el token de restablecimiento de contraseña ya enviado no funcionará, los usuarios deberán solicitar uno nuevo.
- el formulario de comentarios (si se usa
django.contrib.comments
) no validará si se solicitó antes del cambio de valor y se envió después del cambio de valor. Creo que esto es muy pequeño, pero puede ser confuso para el usuario.
- los mensajes (desde
django.contrib.messages
) no validarán el lado del servidor en las mismas condiciones de tiempo que para el formulario de comentarios.
ACTUALIZACIÓN : ahora trabajando en django 1.9.5, un vistazo rápido a la fuente me da casi las mismas respuestas. Podría hacer una inspección minuciosa más tarde.
data decode will break
y tal vez señalar algún código (en django o proyecto de ejemplo) que se romperá? EDITAR: sigo usando django 1.4, ¿es ese el caso?SECRET_KEY
se usa ensalted_hmac
hash los datos de la sesión.<algorithm>$<iterations>$<salt>$<hash>
en auth_user, por lo que la sal aleatoria se almacena junto con la contraseña en cada caso.Desde que se hizo esta pregunta, la documentación de Django ha cambiado para incluir una respuesta.
No estaba claro para mí exactamente cómo debía girar la clave secreta. Encontré una discusión sobre cómo Django genera una clave para un nuevo proyecto , así como un Gist que analiza otras opciones . Finalmente decidí que Django creara un nuevo proyecto, copie la nueva clave secreta en mi antiguo proyecto y luego borre el nuevo proyecto .
Actualizar
Parece que Django agregó la
get_random_secret_key()
función en la versión 1.10. Podrías usar eso para generar una nueva clave secreta.fuente
startproject
, puede ver que solo genera una cadena aleatoria utilizando elcrypto
módulo.De acuerdo con esta página https://docs.djangoproject.com/en/dev/topics/signing/ , la SECRET_KEY se usa principalmente para cosas transitorias: la firma de datos enviados a través del cable para que pueda detectar la manipulación, por ejemplo. Parece que las cosas que PODRÍAN romperse son:
Alguien con experiencia Django más reciente y / o relevante que yo podría intervenir de otra manera, pero sospecho que a menos que esté haciendo algo explícitamente con la API de firma, esto solo debería crear un inconveniente leve para sus usuarios.
fuente
La cadena SECRET_KEY se usa principalmente para encriptar y / o hacer hash de datos de cookies. Muchos marcos (incluido Django) llegan a esto ya que las cookies de sesión predeterminadas tienen sus propios inconvenientes.
Imagine que tiene un formulario en django para editar artículos con un campo oculto. En este campo oculto se almacena la ID del artículo que está editando. Y si desea asegurarse de que nadie pueda enviarle ninguna otra identificación de artículo, agregará un campo oculto adicional con la identificación hash. Entonces, si alguien cambia la identificación, lo sabrás porque el hash no será el mismo.
Por supuesto, este es un ejemplo trivial, pero así es como se usa SECRET_KEY.
Django lo está utilizando internamente, por ejemplo, para {% csrf_token%} y algunas cosas más. Realmente no debería tener ningún impacto en su aplicación si la cambia, en función de su pregunta y de que no la está utilizando.
Lo único es que tal vez los valores de la sesión se eliminarán. Entonces, por ejemplo, los usuarios tendrán que iniciar sesión en admin nuevamente, porque django no podrá decodificar la sesión con una clave diferente.
fuente
Cometí este mismo error. La contraseña predeterminada tenía una longitud de 50, por lo que utilicé powershell para generar una cadena aleatoria de 50 y reemplacé la antigua SECRET_KEY con ella. Estaba conectado y después de reemplazar la SECRET_KEY mi sesión anterior había sido invalidada.
Con Powershell ( fuente ):
Con Bash ( fuente ):
En este punto, pensé por qué no probar una clave más grande, así que lo intenté con una clave larga de 100 y 1000. Ambos trabajaron. Si entiendo el código fuente , el objeto devuelto por la función de firmante es un hash hmac en base64. RFC 2104 tiene esto que decir para la longitud requerida de una clave secreta HMAC.
Para traducir al habla normal, el tamaño de la clave secreta debe ser del mismo tamaño que la salida. La clave también debe estar en bits. Cada dígito en base64 representa 6 bits. Entonces, si tuviera una contraseña de 50 caracteres, tendría una clave secreta de 50 x 6 = 300 bits. Si está utilizando SHA256, necesitaría una clave de 256 bits ( sha256 utiliza 256 bits por definición ). Por lo tanto, una contraseña larga de 50 debería funcionar a menos que planee usar un algoritmo de hash más grande que SHA256.
Pero dado que los bits adicionales de la clave se están procesando, su tamaño no disminuirá drásticamente el rendimiento. Pero le garantizaría que tiene suficientes bits para funciones hash más grandes. SHA-512 estaría cubierto por una SECRET_KEY de 100 largos ( 50 x 6 = 600 bits> 512 bits ).
fuente