Djangoの暗号化方式は、署名者、データの暗号化が付属しています
このようにして取得するために、メールボックスの一般的なアカウントのパスワード、またはトークンの設定
クラスTimestampSigner(署名者): DEFのタイムスタンプ(自己): 戻りbaseconv.base62.encode(INT(time.time())) デフ署名(自己、値): 値 = ' %S%S%S '%(値、 self.sep、self.timestamp()) 戻りスーパー()(値)に署名。 デフ max_ageの=、unsign(自己、値なし): 「「」 元の値を取得し、それはより多くの署名されていないチェック max_ageの秒前よりを。 ""」 結果 = スーパー()。unsign(値) 値、タイムスタンプ = result.rsplit(self.sep、11 ) タイムスタンプ = baseconv.base62.decode(タイムスタンプ) 場合 max_ageのがあるん ではないなし: 場合でisinstance(max_ageの、datetime.timedelta): max_ageの = max_age.total_seconds() #のチェックタイムスタンプがmax_ageのより古いではありません 年齢= time.time() - タイムスタンプ もし年齢> max_ageの: 上げるSignatureExpired( ' 署名年齢%s>は%sの秒'%(年齢、max_ageの)) の戻り値を
これは暗号化されて、あなたは現在のタイムスタンプで結合された入力データの関数に署名署名者など、から継承されて見ることができますDjangoのソース文書であります
unsign現在時刻場合に暗号化されたデータは、時間比較max_ageの時間フォーマットを変換するためのタイムスタンプ機能を得るために、入ってくる暗号化データ、暗号化データ廃止されていることを確認マイナス所定の時間より長い設定時間よりも、例外がスローされ、又は正しい値を返します。
「と表示されます。しかし、暗号化されたデータは、暗号化データ{「ボブ」「名前」}のように、表示されるという大きな問題がある 「:fszfdfyhYRTCFVDRSVG15R1X32B:{」「」ボブ名}は」これは明らかではありません
後でオンラインサインクラスで見つかっ見つける暗号化されたの配列を含み、時間を制御するために添加することができます
実際には、上記のタイムスタンプの暗号化TimestampSignerクラスは、認証の時間の間にタイムスタンプのデフォルトの暗号化を使用する文字の戻り文字列を乗り越え、フラスコとは異なり、有効期限反対暗号化を確認することができます
あなたはこの検証の使用を確認する必要があり、次のページに、クッキーに保存することができます(PSクッキー長い時間のためにこのカードを、私はあなたがたのcookeisが過去に合格しなかったと思った、それは...、元のHttpResponseのセットを空にすることが必要となっています)
復号符号値
同じソースもTimestampSignerタイムスタンプ復号は次のように
デフォルトの暗号化キーとSIGINが設定されていないと同じように、最初は簡単に支配します
max_ageのは(対時間)のパラメータを有している unsign復号化源
たとえば、暗号化され、unsign入力max_ageの= 60秒の値を用いて復号化されるに含まれる暗号化された1:10 1:10時間符号値にある 設けられていない、比較永続
解密过程中对比 将时间格式化 当前解密时的时间 减去 加密的时间 得到相减的时间 如果大于设置过期时间 抛出异常 不然返回解密值
所以我的代码是
加密
from datetime import datetime from django.core import signing def set_sign(request): value = signing.dumps({'user':1254,'name':'xiaoming小明'}) print(value) request.COOKIES['sign'] = value req = HttpResponse('获取sign值成功') req.set_cookie('sign',value) return req
解密
def get_sign(request): value = request.COOKIES.get('sign') print(value) s = '没有获取到sign' if value: try: s = signing.loads(value,max_age=20) # 设置过期时间 print(s,datetime.now()) print(type(s)) # 加密时什么格式 返回什么格式 except: print('sign过期',datetime.now()) s = 'sign过期' return HttpResponse(s)
结果
获取不过期的sign 并得到结果 传入dict得到dict
对比设置解密时间过期 结果
设置的20秒过期 设置sign时间为20:42:23 获取sign的时间为20:43:38 哪怕能获取到sign值,也会解密错误