django修改SECRET_KEY


visibility 860 message 3 schedule 2018年2月28日 10:03 account_circle huazhaozhe


SECRET_KEY的作用

        由django官方文档可知,当使用startproject创建项目时,自动生成的settings中会得到一个随机的SECRET_KEY,这个值是用来保护签名数据的密匙,必须安全的保护好.官方给出了泄露这个密匙或者使用已知的密匙的警告:

Warning

Keep this value secret.

Running Django with a known SECRET_KEY defeats many of Django’s security protections, and can lead to privilege escalation and remote code execution vulnerabilities.

意思是泄露密匙的情况下可能导致恶意用户提高自己的权限以及远程代码执行漏洞.broken heart

按照官方文档,该密匙有以下作用:

The secret key is used for:

If you rotate your secret key, all of the above will be invalidated. Secret keys are not used for passwords of users and key rotation will not affect them.

这个密匙参与了session及其认证,cookie和基于cookie的messages,form wizard,用户重置密码的令牌,还没有保存的表单,其他所有使用cryptographic signing 签名并且没有提供其他的密匙的情况.

如果改变了这个值,以上经过原来SECRET_KEY签名的都将失效,但这不会改变用户的密码.

        那么这个值是否可以改变呢,当然是可以的.修改这个值不会造成重要数据丢失或者损坏,也不会改变用户的密码,但是session,cookie,cache以及没有保存的表单,基于session或者cookie的如messages将会失效.换言之以下项目会受到影响:

  1. 所有登录的用户,其cookie失效,需要重新登录
  2. 所有还没有保存的表单无效,django表单有CSRF保护即{{ csrf_token }}
  3. 重置密码的链接,令牌失效
  4. 缓存失效
  5. 基于cookie的messages失效

        需要考虑主要受影响的是,处于登录状态的用户或者正在填写表单的用户和重置用户密码的用户,修改这个值之前应该先通知他们.

 

修改SECRET_KEY

查找django1.8.2源码,有:

#django.core.startproject模块:
...
from django.utils.crypto import get_random_string
...
# Create a random SECRET_KEY to put it in the main settings.
chars = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)'
options['secret_key'] = get_random_string(50, chars)
...

#django.utils.crypto模块:
...
def get_random_string(length=12,
                      allowed_chars='abcdefghijklmnopqrstuvwxyz'
                                    'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'):
    """
    Returns a securely generated random string.

    The default length of 12 with the a-z, A-Z, 0-9 character set returns
    a 71-bit value. log_2((26+26+10)^12) =~ 71 bits
    """
    if not using_sysrandom:
        # This is ugly, and a hack, but it makes things better than
        # the alternative of predictability. This re-seeds the PRNG
        # using a value that is hard for an attacker to predict, every
        # time a random string is required. This may change the
        # properties of the chosen random sequence slightly, but this
        # is better than absolute predictability.
        random.seed(
            hashlib.sha256(
                ("%s%s%s" % (
                    random.getstate(),
                    time.time(),
                    settings.SECRET_KEY)).encode('utf-8')
            ).digest())
    return ''.join(random.choice(allowed_chars) for i in range(length))
...

即生成SECRET_KEY的方法如下,不同django版本方法不同:

from django.utils.crypto import get_random_string
chars = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)'
secret_key = get_random_string(50, chars)  #随机得到'w&z^gl0d+vgd6(o^uubyf0$x-1w2m796x*a+m=vl(j-_5rw-$6'

       另外一种更简单的方法就是创建一个文件夹,在这个文件夹下新建一个项目,生成的settings中就含有随机的SECRET_KET,复制到原来项目即可,然后删除刚刚创建的项目:

mkdir ~/key
cd ~/key
django-admin startproject secretkey
grep SECRET_KEY secretkey/secretkey/settings.py  #复制新的SECRET_KEY到原来项目
cd ~
rm -R ~/key

最后重新登录

恩,世界又恢复了和平,真好laugh

 

参考资料

  1. https://docs.djangoproject.com/en/1.8/ref/settings/#secret-key
  2. https://stackoverflow.com/questions/15170637/effects-of-changing-djangos-secret-key
  3. https://www.quora.com/Is-it-possible-to-change-the-secret-key-of-a-Django-application-after-it-deployment-in-production-If-so-what-would-be-the-impacts

 



共有3条评论
登录 发表评论
Butonix 评论说:
schedule 2018年5月11日 20:01

sddgsedgsd
sms
Butonix 回复 Butonix:
schedule 2018年5月11日 20:01

该评论已屏蔽
sms
huazhaozhe 回复 Butonix:
schedule 2018年5月11日 20:09

你要干嘛flushed

sms
    account_balance