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

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

加密簽名

web應用安全的黃金法則是,永遠不要相信來自不可信來源的數(shù)據(jù)。有時通過不可信的媒介來傳遞數(shù)據(jù)會非常方便。密碼簽名后的值可以通過不受信任的途徑傳遞,這樣是安全的,因為任何篡改都會檢測的到。

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

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

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

保護 SECRET_KEY

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

使用底層 API

Django的簽名方法存放于django.core.signing模塊。首先創(chuàng)建一個 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.signing.BadSignature 異常:

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

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

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

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

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

使用salt參數(shù)

如果你不希望對每個特定的字符串都生成一個相同的簽名哈希值,你可以在Signer類中使用可選的salt 參數(shù)。使用salt參數(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會把不同的簽名放在不同的命名空間中。來自于單一命名空間(一個特定的salt值)的簽名不能用于在不同的命名空間中驗證相同的純文本字符串。不同的命名空間使用不同的salt設置。這是為了防止攻擊者使用在一個地方的代碼中生成的簽名后的字符串,作為使用不同salt來生成(和驗證)簽名的另一處代碼的輸入。

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

驗證帶有時間戳的值

TimestampSignerSigner的子類,它向值附加一個簽名后的時間戳。這可以讓你確認一個簽名后的值是否在特定時間段之內(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,并且附加當前的時間戳。

unsign(value, max_age=None)[source]

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

Changed in Django 1.8:

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

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

如果你希望保護一個列表、元組或字典,你可以使用簽名模塊的dumpsloads 函數(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ū)別),如果你傳進來一個元組,你會從signing.loads(object)得到一個列表:

>>> 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字符串。序列化的對象使用TimestampSigner來簽名。

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

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

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

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

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

上一篇:設置下一篇:使用Django輸出PDF