2011-09-11 18 views
76

¿Cuál es exactamente el punto del SECRET_KEY en django? Hice algunas búsquedas en Google y revisé los documentos (https://docs.djangoproject.com/en/dev/ref/settings/#secret-key), pero estaba buscando una explicación más detallada de esto, y por qué es necesario.Propósito de la configuración de Django 'SECRET_KEY'

Por ejemplo, ¿qué pasaría si la clave se viera comprometida/otros supieran qué era? Gracias.

+3

Si tiene una clave secreta, y está comprometida y se ha divulgado a otras personas, tiene un problema. No importa si estás usando Django o no. –

+19

¿Pero qué problema exactamente? – tobych

+3

Hice una respuesta exhaustiva [aquí] (http://stackoverflow.com/questions/15170637/effects-of-changing-djangos-secret-key/15383766?noredirect=1#comment21743494_15383766) (enchufe desvergonzado) – sberder

Respuesta

60

Se utiliza para hacer hashes. Mira:

>grep -Inr SECRET_KEY * 
conf/global_settings.py:255:SECRET_KEY = '' 
conf/project_template/settings.py:61:SECRET_KEY = '' 
contrib/auth/tokens.py:54:  hash = sha_constructor(settings.SECRET_KEY + unicode(user.id) + 
contrib/comments/forms.py:86:  info = (content_type, object_pk, timestamp, settings.SECRET_KEY) 
contrib/formtools/utils.py:15: order, pickles the result with the SECRET_KEY setting, then takes an md5 
contrib/formtools/utils.py:32: data.append(settings.SECRET_KEY) 
contrib/messages/storage/cookie.py:112:  SECRET_KEY, modified to make it unique for the present purpose. 
contrib/messages/storage/cookie.py:114:  key = 'django.contrib.messages' + settings.SECRET_KEY 
contrib/sessions/backends/base.py:89:  pickled_md5 = md5_constructor(pickled + settings.SECRET_KEY).hexdigest() 
contrib/sessions/backends/base.py:95:  if md5_constructor(pickled + settings.SECRET_KEY).hexdigest() != tamper_check: 
contrib/sessions/backends/base.py:134:  # Use settings.SECRET_KEY as added salt. 
contrib/sessions/backends/base.py:143:      settings.SECRET_KEY)).hexdigest() 
contrib/sessions/models.py:16:  pickled_md5 = md5_constructor(pickled + settings.SECRET_KEY).hexdigest() 
contrib/sessions/models.py:59:  if md5_constructor(pickled + settings.SECRET_KEY).hexdigest() != tamper_check: 
core/management/commands/startproject.py:32:  # Create a random SECRET_KEY hash, and put it in the main settings. 
core/management/commands/startproject.py:37:  settings_contents = re.sub(r"(?<=SECRET_KEY = ')'", secret_key + "'", settings_contents) 
middleware/csrf.py:38:    % (randrange(0, _MAX_CSRF_KEY), settings.SECRET_KEY)).hexdigest() 
middleware/csrf.py:41: return md5_constructor(settings.SECRET_KEY + session_id).hexdigest() 
+4

¿Por qué entonces no lo llamaron sal? ;) – datenwolf

+9

Esto es una suposición, pero supongo que es más fácil decirle a la gente "no comparta su' SECRET_KEY' ", a diferencia de" su 'SALT' es una clave secreta que debe guardar para sí mismo". –

+5

Esa distinción es muy importante. En la criptografía, las sales no son secretas, pero 'SECRET_KEY' debe mantenerse seguro. El uso de 'SECRET_KEY' es mucho más parecido al uso de una clave en un hash firmado como HMAC (que, si el rendimiento no fuera una consideración, probablemente se usaría en su lugar). –

2

El Django documentation for cryptographic signing cubre los usos del parámetro de 'SECRET_KEY':

Este valor [el ajuste SECRET_KEY] es la clave para asegurar los datos firmados - es vital mantener este seguro, o los atacantes podrían usarlo para generar sus propios valores firmados.

(Esta sección también se hace referencia a partir de the Django documentation for the ‘SECRET_KEY’ setting.)

La API de firma criptográfica en Django está disponible para cualquier aplicación para firmas criptográficamente seguras sobre los valores. Django mismo hace uso de esto en varias características de nivel superior:

  • Signing serialised data (por ejemplo documentos JSON).

  • fichas únicas para una sesión de usuario, solicitud de restablecimiento de contraseña, mensajes, etc.

  • prevención de ataques de repetición entre sitios o mediante la adición de (y luego esperar) valores únicos para la solicitud.

  • Generando una sal única para funciones hash.

Por lo tanto, la respuesta general es: Hay muchas cosas en una aplicación Django que requieren una firma criptográfica, y el ajuste ‘SECRET_KEY’ es la clave utilizada para aquellos. Necesita tener una cantidad de entopia criptográficamente fuerte (difícil de adivinar para las computadoras) y única entre todas las instancias de Django.

Cuestiones relacionadas