Beispiel #1
0
  ...
itsdangerous.SignatureExpired: Signature age 15 > 5 seconds



Serializer
# Поскольку строки трудно обрабатывать, этот модуль также 
# обеспечивает интерфейс сериализации, подобный json / pickle 
# и другим. (Внутри он использует simplejson по умолчанию, 
# однако это может быть изменено путем подклассификации.) Класс 
# Serializer реализует следующее:

> from itsdangerous import Serializer
> s = Serializer('secret-key')

> s.dumps([1, 2, 3, 4]) # '[1, 2, 3, 4].r7R9RhGgDPvvWl3iNzLuIIfELmo'
# метод dumps() генерирует цифровую подпись для данных, переданных
# в аргументе и затем сериализует данные с подписью в строковый
# маркер

> s.loads('[1, 2, 3, 4].r7R9RhGgDPvvWl3iNzLuIIfELmo') # [1, 2, 3, 4]
# метод loads() расшифровывает маркер. Функция проверяет сигнатуры
# и срок хранения и если всё в порядке, возвращает исходные данные.
# Когда метод loads() получает недопустимый маркер или определяет,
# что срок хранения истёк, он возбуждает исключение. 


URLSafeSerialize
> from itsdangerous import URLSafeSerializer
> s = URLSafeSerializer('secret-key')
> s.dumps([1, 2, 3, 4]) # 'WzEsMiwzLDRd.wSPHqC0gR7VUqivlSukJ0IeTDgo'
Beispiel #2
0
#
# Free Coding session for 2015-03-09
# Written by Matt Warren
#


if __name__ == '__main__':
    s = Signer('secret-password')
    signed_string = s.sign(b'data to sign')
    print(signed_string)  # HMAC SHA1 signed string

    # tamper with string
    signed_string = b'my ' + signed_string
    try:
        s.unsign(signed_string)
    except BadSignature as e:
        print("failed to unsign the modified data")

    s = TimestampSigner('secret-password', salt='signup')  # adds current time to data
    signed_string = s.sign(b'data to sign')
    print(signed_string)
    s.unsign(signed_string, max_age=5)  # would only unsign if signed less than 5 seconds ago
    time.sleep(2)
    try:
        s.unsign(signed_string, max_age=1)  # would only unsign if signed less than 1 seconds ago
    except SignatureExpired as e:
        print('tried to unsign expired data')

    s = JSONWebSignatureSerializer('secret-password')
    print(s.dumps({'name': 'matt'}))
Beispiel #3
0
print(raw_str)  #输出 b'my string'

详解:
1)Signer类必须接收一个参数,作为秘钥,进行相关的初始化,例如:初始化 派生秘钥,盐值,哈希算法,具体可以查看源代码。
2)签名的时候默认先把 字符串 进行 utf8编码,然后计算签名。所以如果是中文,这里要注意了。
3)unsign 方法用来 验证 签名字符串是否是 合法的。如果验证通过,返回字符串本身(bytes类型)。


2. Serializer 类
Signer类 只能签名字符串,为了可以签名其他类型数据,Serializer 类提供了两个方法dumps/loads,类似json模块。

基本使用例子:
from itsdangerous.serializer import Serializer

s = Serializer("secret-key")
ret = s.dumps([1, 2, 3, 4])
print(ret)   # str类型:[1, 2, 3, 4].r7R9RhGgDPvvWl3iNzLuIIfELmo

raw_list = s.loads('[1, 2, 3, 4].r7R9RhGgDPvvWl3iNzLuIIfELmo')
print(raw_list)  # list类型: [1, 2, 3, 4]

详解:
1) dumps 先把 列表 序列化成 字符串,然后进行签名。
2) loads 验证 签名,如果通过,返回 反序列数据。
3) 可以通过定义子类的方式,更改 序列化 使用的模块。(默认使用 json模块)


3. 如果想要你的签名 支持有效期,
请参考:https://itsdangerous.palletsprojects.com/en/1.1.x/timed/