加密签名官方参考: https://docs.djangoproject.com/en/4.1/topics/signing/
当您使用 创建一个新的 Django 项目startproject时,该 settings.py文件会自动生成并获取一个随机 SECRET_KEY值。该值是保护签名数据的关键——确保其安全至关重要,否则攻击者可以使用它来生成自己的签名值。
SECRET_KEY,用于提供 加密签名,并且应该设置为唯一的、不可预测的值。
警告: 使用公开的的SECRET_KEY 运行Django会击败Django的许多安全保护,并可能导致特权升级和远程代码执行漏洞。 因此,SECRET_KEY 不能泄漏~!
SECRET_KEY用于:
所有 sessions ,如果您使用任何其他会话后端django.contrib.sessions.backends.cache
,或者使用默认设置 get_session_auth_hash()
。
messages CookieStorage 或 FallbackStorage
'django.contrib.messages’在INSTALLED_APPS.
所有使用PasswordResetView token。
加密签名的使用,除非提供了不同的密钥。
class PasswordResetView
允许用户通过生成可用于重置密码的一次性使用链接并将该链接发送到用户的注册电子邮件地址来重置其密码。
如果满足以下条件,此视图将发送电子邮件:
如果不满足这些条件中的任何一个,则不会发送电子邮件,但用户也不会收到任何错误消息。这可以防止信息泄露给潜在的攻击者。
Web 应用程序安全的黄金法则是永远不要信任来自不受信任来源的数据。有时通过不受信任的介质传递数据很有用。在知道任何篡改都会被检测到的情况下,加密签名的值可以通过不受信任的安全通道传递。
Django 提供了一个用于签名值的低级 API 和一个用于设置和读取签名 cookie 的高级 API,这是登录 Web 应用程序的最常见用途之一。
您可能还会发现签名对以下内容很有用:
Django的签名方法在django.core.signing模块中
>>> from django.core.signing import Signer
>>> signer = Signer()
>>> value = signer.sign('My string')
>>> value
'My string:GdMGD6HNQ_qdgxYP8yBZAdAIV1w'
您可以使用unsign方法检索原始值:
>>> original = signer.unsign(value)
>>> original
'My string'
如果您希望保护列表,元组或字典,则可以使用 sign_object() and unsign_object() 方法进行操作:
>>> signed_obj = signer.sign_object({'message': 'Hello!'})
>>> signed_obj
'eyJtZXNzYWdlIjoiSGVsbG8hIn0:Xdc-mOFDjs22KsQAqfVfi8PQSPdo3ckWJxPWwQOFhR4'
>>> obj = signer.unsign_object(signed_obj)
>>> obj
{'message': 'Hello!'}
默认情况下,Signer 类使用SECRET_KEY
设置来生成签名。您可以通过将其传递给签名构造函数来使用其他值:
>>> signer = Signer('my-other-secret')
>>> value = signer.sign('My string')
>>> value
'My string:EkfQJafvGyiofrdGnuthdxImIJw'
如果您不希望特定字符串的每次出现都具有相同的签名哈希,则可以使用该类的可选salt参数Signer 。使用盐将使用盐和您的签名散列函数播种SECRET_KEY:
TimestampSigner是一个Signer将签名时间戳附加到值的子类。这使您可以确认在指定时间段内创建了签名值:
>>> from datetime import timedelta
>>> from django.core.signing import TimestampSigner
>>> signer = TimestampSigner()
>>> value = signer.sign('hello')
>>> value
'hello:1NMg5H:oPVuCqlJWmChm1rA2lyTUtelC-c'
>>> signer.unsign(value)
'hello'
>>> signer.unsign(value, max_age=10)
...
SignatureExpired: Signature age 15.5289158821 > 10 seconds
>>> signer.unsign(value, max_age=20)
'hello'
>>> signer.unsign(value, max_age=timedelta(seconds=20))
'hello'
如果你想使用 Django 生成一个,你可以从 python shell 中执行以下操作:
>>> from django.utils.crypto import get_random_string
>>> chars = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)'
>>> SECRET_KEY = get_random_string(50, chars)
>>> print SECRET_KEY
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty
参考URL: https://stackoverflow.com/questions/29455057/django-core-exceptions-improperlyconfigured-the-secret-key-setting-must-not-be
问题描述:
django启动报错:django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
问题分析:
SECRET_KEY如果未设置,Django 将拒绝启动。
您可以在官方docs中阅读有关此设置的更多信息