在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 加密簽名
點(diǎn)擊劫持保護(hù)
安全問題歸檔
Model 類參考
將遺留數(shù)據(jù)庫整合到Django
關(guān)聯(lián)對(duì)象參考
內(nèi)建基于類的視圖的API
聚合
Django 中的用戶認(rèn)證
django.contrib.humanize
Django管理文檔生成器
分頁
使用Django輸出CSV
加密簽名
文件儲(chǔ)存API
安全
Django中的測(cè)試
國際化和本地化
為Django編寫首個(gè)補(bǔ)丁
條件表達(dá)式
日志
模型元選項(xiàng)
部署靜態(tài)文件
執(zhí)行查詢
使用Django認(rèn)證系統(tǒng)
基于類的視圖
中間件
編寫自定義的django-admin命令
Django 的設(shè)置
格式本地化
數(shù)據(jù)庫訪問優(yōu)化
錯(cuò)誤報(bào)告
基于類的內(nèi)建通用視圖
編寫自定義存儲(chǔ)系統(tǒng)
編寫你的第一個(gè) Django 程序 第3部分
編寫數(shù)據(jù)庫遷移
使用表單
編寫你的第一個(gè) Django 程序 第2部分
編寫你的第一個(gè) Django 程序 第1部分
如何使用會(huì)話
系統(tǒng)檢查框架
新手入門
信號(hào)
編寫視圖
如何使用WSGI 部署
編寫你的第一個(gè)Django應(yīng)用,第6部分
常見的網(wǎng)站應(yīng)用工具
Widgets
內(nèi)建的視圖
模型實(shí)例參考
視圖層
Django中的密碼管理
高級(jí)教程:如何編寫可重用的應(yīng)用
國際化和本地化
"本地特色"附加功能
TemplateResponse 和 SimpleTemplateResponse
模式編輯器
文件上傳
快速安裝指南
部署 Django
表單 API
表單素材 ( <code>Media</code> 類)
管理文件
其它核心功能
查找 API 參考
表單
Admin
數(shù)據(jù)庫函數(shù)
自定義查找
使用基于類的視圖處理表單
管理操作
開發(fā)過程
編寫你的第一個(gè)Django應(yīng)用,第5部分
進(jìn)行原始的sql查詢
模型層
多數(shù)據(jù)庫
編寫你的第一個(gè) Django 程序 第4部分
Django安全
Django 初探
Django異常
重定向應(yīng)用
按需內(nèi)容處理
管理器
視圖裝飾器
驗(yàn)證器
使用Django輸出PDF
File對(duì)象
Django 的快捷函數(shù)
基于類的通用視圖 —— 索引
為模型提供初始數(shù)據(jù)
模板層
URL調(diào)度器
中間件
模型

加密簽名

web應(yīng)用安全的黃金法則是,永遠(yuǎn)不要相信來自不可信來源的數(shù)據(jù)。有時(shí)通過不可信的媒介來傳遞數(shù)據(jù)會(huì)非常方便。密碼簽名后的值可以通過不受信任的途徑傳遞,這樣是安全的,因?yàn)槿魏未鄹亩紩?huì)檢測(cè)的到。

Django提供了用于簽名的底層API,以及用于設(shè)置和讀取被簽名cookie的上層API,它們是web應(yīng)用中最常使用的簽名工具之一。

你可能會(huì)發(fā)現(xiàn),簽名對(duì)于以下事情非常有用:

  • 生成用于“重置我的賬戶”的URL,并發(fā)送給丟失密碼的用戶。
  • 確保儲(chǔ)存在隱藏表單字段的數(shù)據(jù)不被篡改,
  • 生成一次性的秘密URL,用于暫時(shí)性允許訪問受保護(hù)的資源,例如用戶付費(fèi)的下載文件。

保護(hù) SECRET_KEY

當(dāng)你使用 startproject創(chuàng)建新的Django項(xiàng)目時(shí),自動(dòng)生成的 settings.py文件會(huì)得到一個(gè)隨機(jī)的SECRET_KEY值。這個(gè)值是保護(hù)簽名數(shù)據(jù)的密鑰 -- 它至關(guān)重要,你必須妥善保管,否則攻擊者會(huì)使用它來生成自己的簽名值。

使用底層 API

Django的簽名方法存放于django.core.signing模塊。首先創(chuàng)建一個(gè) Signer 的實(shí)例來對(duì)一個(gè)值簽名:

>>> from django.core.signing import Signer
>>> signer = Signer()
>>> value = signer.sign('My string')
>>> value
'My string:GdMGD6HNQ_qdgxYP8yBZAdAIV1w'

這個(gè)簽名會(huì)附加到字符串末尾,跟在冒號(hào)后面。你可以使用unsign方法來獲取原始的值:

>>> original = signer.unsign(value)
>>> original
'My string'

如果簽名或者值以任何方式改變,會(huì)拋出django.core.signing.BadSignature 異常:

>>> from django.core import signing
>>> value += 'm'
>>> try:
...    original = signer.unsign(value)
... except signing.BadSignature:
...    print("Tampering detected!")

通常,Signer類使用SECRET_KEY設(shè)置來生成簽名。你可以通過向Signer構(gòu)造器傳遞一個(gè)不同的密鑰來使用它:

>>> signer = Signer('my-other-secret')
>>> value = signer.sign('My string')
>>> value
'My string:EkfQJafvGyiofrdGnuthdxImIJw'

class Signer(key=None, sep=':', salt=None)[source]

返回一個(gè)signer,它使用key 來生成簽名,并且使用sep來分割值。sep 不能是 [URL安全的base64字母表(http://tools.ietf.org/html/rfc4648#section-5)]中的字符。字母表含有數(shù)字、字母、連字符和下劃線

使用salt參數(shù)

如果你不希望對(duì)每個(gè)特定的字符串都生成一個(gè)相同的簽名哈希值,你可以在Signer類中使用可選的salt 參數(shù)。使用salt參數(shù)會(huì)同時(shí)用它和SECRET_KEY初始化簽名哈希函數(shù):

>>> 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會(huì)把不同的簽名放在不同的命名空間中。來自于單一命名空間(一個(gè)特定的salt值)的簽名不能用于在不同的命名空間中驗(yàn)證相同的純文本字符串。不同的命名空間使用不同的salt設(shè)置。這是為了防止攻擊者使用在一個(gè)地方的代碼中生成的簽名后的字符串,作為使用不同salt來生成(和驗(yàn)證)簽名的另一處代碼的輸入。

不像你的SECRET_KEY,你的salt參數(shù)可以不用保密。

驗(yàn)證帶有時(shí)間戳的值

TimestampSignerSigner的子類,它向值附加一個(gè)簽名后的時(shí)間戳。這可以讓你確認(rèn)一個(gè)簽名后的值是否在特定時(shí)間段之內(nèi)被創(chuàng)建:

>>> 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'

class TimestampSigner(key=None, sep=':', salt=None)[source]

sign(value)[source]

簽名value,并且附加當(dāng)前的時(shí)間戳。

unsign(value, max_age=None)[source]

檢查value是否在少于max_age 秒之前被簽名,如果不是則拋出SignatureExpired異常。max_age 參數(shù)接受一個(gè)整數(shù)或者datetime.timedelta對(duì)象。

Changed in Django 1.8:

在此之前, max_age參數(shù)只接受整數(shù)。

保護(hù)復(fù)雜的數(shù)據(jù)結(jié)構(gòu)

如果你希望保護(hù)一個(gè)列表、元組或字典,你可以使用簽名模塊的dumpsloads 函數(shù)來實(shí)現(xiàn)。它們模仿了Python的pickle模塊,但是在背后使用了JSON序列化。JSON可以確保即使你的SECRET_KEY被盜取,攻擊者并不能利用pickle的格式來執(zhí)行任意的命令:

>>> from django.core import signing
>>> value = signing.dumps({"foo": "bar"})
>>> value
'eyJmb28iOiJiYXIifQ:1NMg1b:zGcDE4-TCkaeGzLeW9UQwZesciI'
>>> signing.loads(value)
{'foo': 'bar'}

由于JSON的本質(zhì)(列表和元組之間沒有原生的區(qū)別),如果你傳進(jìn)來一個(gè)元組,你會(huì)從signing.loads(object)得到一個(gè)列表:

>>> from django.core import signing
>>> value = signing.dumps(('a','b','c'))
>>> signing.loads(value)
['a', 'b', 'c']

dumps(obj, key=None, salt='django.core.signing', compress=False)[source]

返回URL安全,sha1簽名的base64壓縮的JSON字符串。序列化的對(duì)象使用TimestampSigner來簽名。

loads(string, key=None, salt='django.core.signing', max_age=None)[source]

dumps()的反轉(zhuǎn),如果簽名失敗則拋出BadSignature異常。如果提供了max_age則會(huì)檢查它(以秒為單位)。

譯者:Django 文檔協(xié)作翻譯小組,原文:Cryptographic signing

本文以 CC BY-NC-SA 3.0 協(xié)議發(fā)布,轉(zhuǎn)載請(qǐng)保留作者署名和文章出處。

Django 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。交流群:467338606。

上一篇:視圖裝飾器下一篇:模型層