TimedJSONWebSignatureSerializer vs URLSafeTimedSerializer: Когда мне использовать что? - PullRequest
0 голосов
/ 21 июня 2019

Я нашел 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 Ответ

0 голосов
/ 25 июля 2019

У меня сложилось впечатление, что оба могут быть для одного и того же варианта использования, но, возможно, веб-подписи JSON стандартизированы, а другой нет?

Вариант использования обоих методовпочти такой же, но без дополнительных шагов программирования вам понадобится библиотека Itsdangerous с обеих сторон (отправитель и получатель), когда вы используете URLSafeTimedSerializer, в то время как TimedJSONWebSignatureSerializer более гибок, поскольку формат веб-подписи JSON стандартизирован .Это расширяет случай использования TimedJSONWebSignatureSerializer для связи с программным обеспечением, написанным на других языках, потому что он основан на формате JSON и есть библиотек, доступных для многих разных языков .

Фактически, JSONWeb Sigbnature и, как правило, JSON Web Tokens довольно часто используются в качестве токенов авторизации, но не ограничиваются этим вариантом использования.

Различные результаты ваших примеров имеют две причины:

  • Для формата JSON Web Signature требуется заголовок и часть полезной нагрузки, которые представлены в формате JSON, и этот заголовок также содержит обязательную alg претензию , которая

    определяет криптографический алгоритм, используемый для защиты JWS.

  • Два метода используют разные криптографические алгоритмы для подписи: URLSafeTimedSerializer использует по умолчанию SHA1

    Внутренне опасно использование HMAC и SHA1, ( согласно документам )

    , а TimedJSONWebSignatureSerializer использует SHA512, см.декодированный заголовок:

    {"alg": "HS512", "iat": 1561104545, "exp": 1561108145}

    Последний длиннее, но также и безопаснее,( см. SHA1 против SHA256 )

Я надеюсь, что это объясняет различные варианты использования и результаты этих методов.

Кстати.«интересно» видеть утверждения iat (выданные в) и exp (истекающие в) в заголовке, никогда раньше не виденные.Обычно они являются частью полезной нагрузки.Возникает вопрос: зачем вообще использовать Itsdangerous, если вы хотите выводить JWS / JWT, поскольку для этого есть много других библиотек, в том числе и для python.

...