2015-04-20 4 views
1

У меня есть скрипт python, который требует изменения django SECRET_KEY несколько раз на протяжении всего выполнения. Вот пример того, что я пытаюсь сделать:Изменение секретного ключа Django в скрипте

from django.core import signing 

# SECRET_KEY = "abc" 
print signing.dumps("value") 
# SECRET_KEY = "123" 
print signing.dumps("value") 
# SECRET_KEY = "test" 
print signing.dumps("value") 

Метод signing.dumps требует SECRET_KEY быть уже привязанный, хотя, кажется, не есть аргумент, чтобы изменить его в скрипте.

Как бы я поменял SECRET_KEY несколько раз в моем сценарии?

ответ

0

Если вы внимательно посмотрите на dumps method in signing.py, вы увидите, что он принимает ключ в качестве ключа подписи:

Если ключ не является None, settings.SECRET_KEY используется вместо этого.

def dumps(obj, key=None, salt='django.core.signing', serializer=JSONSerializer, compress=False): 
    """ 
    Returns URL-safe, sha1 signed base64 compressed JSON string. If key is 
    None, settings.SECRET_KEY is used instead. 
    If compress is True (not the default) checks if compressing using zlib can 
    save some space. Prepends a '.' to signify compression. This is included 
    in the signature, to protect against zip bombs. 
    Salt can be used to namespace the hash, so that a signed string is 
    only valid for a given namespace. Leaving this at the default 
    value or re-using a salt value across different parts of your 
    application without good cause is a security risk. 
    The serializer is expected to return a bytestring. 
    """ 

Так все, что вам нужно сделать, это пройти различные секретные ключи вокруг каждый раз:

SECRET_KEY = "abc" 
print signing.dumps("value", key=SECRET_KEY) 
SECRET_KEY = "123" 
print signing.dumps("value", key=SECRET_KEY) 

Тем не менее, это выглядит как плохая идея для меня, так как вы не подписания контракта с по умолчанию ключ. Если вам действительно нужно подписать тексты, используйте Signer class для создания и создания объектов с новыми key и используйте его как Signer(key="NEW KEY").

0

Две вещи:

  1. Вам не нужно изменить secret_key. На самом деле, если вы это сделаете, вы не сможете распечатать что-то, что вы подписали!
  2. Функция sign.dumps() предназначена для сложных типов данных, таких как словари и кортежи.

Если у вас есть одно значение, которое вы пытаетесь войти, вы можете сделать следующее:

from django.core.signing import Signer 
signer = Signer() 
value = signer.sign('My string') 

... а затем после того как форма размещена вы можете проверить подпись .. .

try: 
    original = signer.unsign(value) 
except signing.BadSignature: 
    print("Tampering detected!") 
+0

Вы также можете установить ключ, используя: signer = Signer ('my-other-secret'). – jbiz

Смежные вопросы