日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

django 1.8 官方文档翻译:8-5 加密签名

發(fā)布時(shí)間:2024/4/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 django 1.8 官方文档翻译:8-5 加密签名 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

加密簽名

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

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

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

  • 生成用于“重置我的賬戶”的URL,并發(fā)送給丟失密碼的用戶。

  • 確保儲(chǔ)存在隱藏表單字段的數(shù)據(jù)不被篡改,

  • 生成一次性的秘密URL,用于暫時(shí)性允許訪問(wèn)受保護(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ì)使用它來(lái)生成自己的簽名值。

使用底層 API

Django的簽名方法存放于django.core.signing模塊。首先創(chuàng)建一個(gè) Signer 的實(shí)例來(lái)對(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方法來(lái)獲取原始的值:

>>> 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è)置來(lái)生成簽名。你可以通過(guò)向Signer構(gòu)造器傳遞一個(gè)不同的密鑰來(lái)使用它:

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

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

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

TimestampSigner是 Signer的子類,它向值附加一個(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è)列表、元組或字典,你可以使用簽名模塊的dumps 和 loads 函數(shù)來(lái)實(shí)現(xiàn)。它們模仿了Python的pickle模塊,但是在背后使用了JSON序列化。JSON可以確保即使你的SECRET_KEY被盜取,攻擊者并不能利用pickle的格式來(lái)執(zhí)行任意的命令:

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

由于JSON的本質(zhì)(列表和元組之間沒(méi)有原生的區(qū)別),如果你傳進(jìn)來(lái)一個(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來(lái)簽名。

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。

總結(jié)

以上是生活随笔為你收集整理的django 1.8 官方文档翻译:8-5 加密签名的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。