2015-04-20 39 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仔细观察,你会发现它接受一个关键的签名密钥:

如果关键是没有,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创建并实例化新对象,并使用它,如Signer(key="NEW KEY")

0

两件事情:

  1. 你不需要改变你的SECRET_KEY。事实上,如果你这样做,你将无法签名你签署的东西!
  2. signing.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