django登录加密
1.注意保护密匙
当使用startproject创建一个新的Django项目时,settings.py文件将自动生成,并获得一个随机的SECRET_KEY值。这个值是保护签名数据的关键——保持这个安全非常重要,否则攻击者可以使用它生成自己的签名值。
2.使用低级API
Django的签名方法位于django.core.signing模块中。要对值进行签名,首先实例化一个Signer实例:
>>> 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'
如果签名或值已被以任何方式更改,则使用,将引发django.core. signature.BadSignature异常:
>>> from django.core import signing
>>> value += 'm'
>>> try:
... original = signer.unsign(value)
... except signing.BadSignature:
... print("Tampering detected!")
*:*默认情况下,Signer类使用SECRET_KEY设置来生成签名。您可以使用另一个密匙,将其传递给Signer构造函数:
>>> signer = Signer('my-other-secret')
>>> value = signer.sign('My string')
>>> value
'My string:EkfQJafvGyiofrdGnuthdxImIJw'
3.使用salt参数
如果不希望特定字符串每次出现都具有相同的签名散列,可以使用Signer类的可选salt参数。使用salt将使用salt参数值和您的SECRET_KEY来播种签名散列函数:
>>> signer = Signer()
>>> signer.sign('My string')
'My string:GdMGD6HNQ_qdgxYP8yBZAdAIV1w'
>>> signer = Signer(salt='extra')
>>> signer.sign('My string')
'My string:Ee7vGi-ING6n02gkcJ-QLHg6vFw'
>>> signer.unsign('My string:Ee7vGi-ING6n02gkcJ-QLHg6vFw')
'My string'
使用salt参数将不同的签名放入不同的签名空间。来自同一个命名空间(对应一个特定的salt值)的签名不能在使用不同salt值设置的不同命名空间中验证相同的纯文本字符串。这样做的目的在于防止攻击者将代码中某个位置生成的签名字符串作为另一段使用不同salt值生成(并验证)签名的代码输入。
4.验证时间戳值
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'
5.保护复杂的数据结构
如果希望保护列表、元组或字典,可以使用签名模块的dumps和loads函数来实现。它们模仿Python的pickle模块,但在底层使用JSON序列化。JSON确保即使SECRET_KEY被窃取,攻击者也不能通过使用pickle格式执行任意命令:
>>> from django.core import signing
>>> value = signing.dumps({"foo": "bar"})
>>> value
'eyJmb28iOiJiYXIifQ:1NMg1b:zGcDE4-TCkaeGzLeW9UQwZesciI'
>>> signing.loads(value)
{'foo': 'bar'}
由于JSON的本质(列表和元组之间没有天生的区别),如果传入一个元组,将会从**sign .load (object)**中得到一个列表:
>>> from django.core import signing
>>> value = signing.dumps(('a','b','c'))
>>> signing.loads(value)
['a', 'b', 'c']

1757

被折叠的 条评论
为什么被折叠?



