• django setting.py中的SECRET_KEY


    django setting.py中的SECRET_KEY

    官方docs

    什么是SECRET_KEY

    加密签名官方参考: 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。

    • 加密签名的使用,除非提供了不同的密钥。

    PasswordResetView

    class PasswordResetView允许用户通过生成可用于重置密码的一次性使用链接并将该链接发送到用户的注册电子邮件地址来重置其密码。

    如果满足以下条件,此视图将发送电子邮件:

    • 提供的电子邮件地址存在于系统中。
    • 请求的用户处于活动状态(User.is_activeis True)。
    • 请求的用户有一个可用的密码。使用不可用密码(请参阅 set_unusable_password())标记的用户在使用 LDAP 等外部身份验证源时,不允许请求密码重置以防止误用。

    如果不满足这些条件中的任何一个,则不会发送电子邮件,但用户也不会收到任何错误消息。这可以防止信息泄露给潜在的攻击者。

    加密签名使用

    Web 应用程序安全的黄金法则是永远不要信任来自不受信任来源的数据。有时通过不受信任的介质传递数据很有用。在知道任何篡改都会被检测到的情况下,加密签名的值可以通过不受信任的安全通道传递。

    Django 提供了一个用于签名值的低级 API 和一个用于设置和读取签名 cookie 的高级 API,这是登录 Web 应用程序的最常见用途之一。

    您可能还会发现签名对以下内容很有用:

    • 生成“恢复我的帐户”URL 以发送给丢失密码的用户。
    • 确保存储在隐藏表单字段中的数据未被篡改。
    • 生成一次性秘密 URL 以允许临时访问受保护的资源,例如用户付费的可下载文件。

    Django的签名方法在django.core.signing模块中

    >>> from django.core.signing import Signer
    >>> signer = Signer()
    >>> value = signer.sign('My string')
    >>> value
    'My string:GdMGD6HNQ_qdgxYP8yBZAdAIV1w'
    
    • 1
    • 2
    • 3
    • 4
    • 5

    您可以使用unsign方法检索原始值:

    >>> original = signer.unsign(value)
    >>> original
    'My string'
    
    • 1
    • 2
    • 3

    如果您希望保护列表,元组或字典,则可以使用 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!'}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    默认情况下,Signer 类使用SECRET_KEY 设置来生成签名。您可以通过将其传递给签名构造函数来使用其他值:

    >>> signer = Signer('my-other-secret')
    >>> value = signer.sign('My string')
    >>> value
    'My string:EkfQJafvGyiofrdGnuthdxImIJw'
    
    • 1
    • 2
    • 3
    • 4
    使用salt参数

    如果您不希望特定字符串的每次出现都具有相同的签名哈希,则可以使用该类的可选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'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    生成一个SECRET_KEY

    如果你想使用 Django 生成一个,你可以从 python shell 中执行以下操作:

    >>> from django.utils.crypto import get_random_string
    >>> chars = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)'
    >>> SECRET_KEY = get_random_string(50, chars)
    >>> print SECRET_KEY
    
    • 1
    • 2
    • 3
    • 4

    django启动报错:django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.

    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中阅读有关此设置的更多信息

  • 相关阅读:
    【毕业设计】单片机 宠物自动喂食系统 - stm32 物联网 嵌入式
    Geogebra 教程之 01 什么是Geogebra,真的可以提高我们数学水平么?
    WEB前端网页设计 网页代码参数(背景、图片)类
    设计模式—结构型模式之享元模式
    2022 年“苹果学者”名单公布,4 位华人学生位列其中
    Python教程之使用 Python 识别加密的 PDF 文档和解密受 PDF
    出栈序列的合法性
    SSM框架简单介绍
    spark3.3.1 for CDH6.3.2 打包
    MyBatis-Plus用法
  • 原文地址:https://blog.csdn.net/inthat/article/details/126942525