... 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'
# # 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'}))
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/