TimedJSONWebSignatureSerializer vs URLSafeTimedSerializer: Когда мне использовать что?
Я нашел TimedJSONWebSignatureSerializer
а также URLSafeTimedSerializer
, Интересно, почему существуют эти два метода? Как пользователь этой библиотеки, какие причины выбрать один или другой?
Что я пробовал
Я даже не нашла TimedJSONWebSignatureSerializer
в документах, но только что-то общее о JSON Web Signatures.
Глядя на наследство не помогло
TimedJSONWebSignatureSerializer
наследует отJSONWebSignatureSerializer
URLSafeTimedSerializer
наследует отURLSafeSerializerMixin
,TimedSerializer
Глядя на конструкторы, у меня складывается впечатление, что оба могут быть для одного и того же варианта использования, но, возможно, веб-подписи JSON стандартизированы, а другой - нет?
Глядя на использование:
from itsdangerous import TimedJSONWebSignatureSerializer, URLSafeTimedSerializer
data = {"id": 42, "op": "foobar"}
max_age_s = 123
s1 = TimedJSONWebSignatureSerializer('secret', expires_in=max_age_s)
s1_dumped = s1.dumps(data)
s1_loaded = s1.loads(s1_dumped)
s2 = URLSafeTimedSerializer('secret')
s2_dumped = s2.dumps(data)
s2_loaded = s2.loads(s2_dumped, max_age=max_age_s)
затем
>>> s1_dumped
b'eyJhbGciOiJIUzUxMiIsImlhdCI6MTU2MTEwNDU0NSwiZXhwIjoxNTYxMTA4MTQ1fQ.eyJpZCI6NDIsIm9wIjoiZm9vYmFyIn0.sux9j4OpBc7-se16WSrZvp-bll5ZeyCQR_CumSE7jPQ9-w_kTqpr0OtwhJp8S766Xt1W3fKSE-dl2z8q9ZAhzg'
>>> s2_dumped
'eyJpZCI6NDIsIm9wIjoiZm9vYmFyIn0.XQyQoQ.-6n5Jw6TWz8tsyfgagyS5_fHjAY'
>>> len(s1_dumped)
185
>>> len(s2_dumped)
66
Следовательно, JSON Web Signature намного длиннее. Что ты выигрываешь, имея это?
1 ответ
У меня сложилось впечатление, что оба могут быть для одного и того же варианта использования, но, возможно, веб-подписи JSON стандартизированы, а другой нет?
Варианты использования обоих методов практически одинаковы, но без дополнительных шагов программирования вам понадобится библиотека Itsdangerous с обеих сторон (отправитель и получатель), когда вы используете URLSafeTimedSerializer
пока TimedJSONWebSignatureSerializer
является более гибким, потому что формат JSON Web Signature стандартизирован. Это расширяет случай использования TimedJSONWebSignatureSerializer
для связи с программным обеспечением, написанным на других языках, потому что оно основано на формате JSON и есть библиотеки, доступные для разных языков.
Фактически, JSON Web Sigbnature и, как правило, JSON Web Tokens довольно часто используются в качестве токенов авторизации, но не ограничиваются этим вариантом использования.
Разные результаты ваших примеров имеют две причины:
Формат JSON Web Signature требует заголовка и части полезной нагрузки, которые представлены в формате JSON, а заголовок также содержит обязательный
alg
претензия, котораяидентифицирует криптографический алгоритм, используемый для защиты JWS.
Два метода используют разные криптографические алгоритмы для подписи:
URLSafeTimedSerializer
по умолчанию использует SHA1Внутренне опасно использование HMAC и SHA1, ( согласно документам)
пока
TimedJSONWebSignatureSerializer
использует SHA512, см. декодированный заголовок:{"alg": "HS512", "iat": 1561104545, "exp": 1561108145}
Последний длиннее, но и безопаснее. ( см. SHA1 против SHA256)
Я надеюсь, что это объясняет различные варианты использования и результаты этих методов.
Btw. это интересно посмотреть iat
(выдан в) и exp
(истекает в) претензии в шапке, никогда не видел этого раньше. Обычно они являются частью полезной нагрузки. Возникает вопрос, зачем вообще использовать Itsdangerous, если вы хотите выводить JWS/JWT, поскольку для этого есть много других библиотек, в том числе и для python.