【问题标题】:TimedJSONWebSignatureSerializer vs URLSafeTimedSerializer: When should I use what?TimedJSONWebSignatureSerializer vs URLSafeTimedSerializer:我什么时候应该使用什么?
【发布时间】:2019-11-04 01:11:34
【问题描述】:

我找到了TimedJSONWebSignatureSerializerURLSafeTimedSerializer。我想知道为什么存在这两种方法。作为该库的用户,选择其中一个的原因是什么?

我尝试过的

我什至在 docs 中都没有找到 TimedJSONWebSignatureSerializer,而只找到了 something general about JSON Web Signatures

查看继承并没有帮助:

  • TimedJSONWebSignatureSerializer 继承自 JSONWebSignatureSerializer
  • URLSafeTimedSerializer 继承自 URLSafeSerializerMixinTimedSerializer

查看构造函数,我的印象是两者可能用于相同的用例,但 JSON Web 签名可能是标准化的,而另一个不是?

用法

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 签名要长得多。拥有它你会赢得什么?

【问题讨论】:

    标签: python jwt json-web-signature itsdangerous


    【解决方案1】:

    我的印象是两者可能适用于相同的用例 但也许 JSON Web 签名是标准化的,而另一个不是?

    这两种方法的用例几乎相同,但是如果没有额外的编程步骤,当您使用URLSafeTimedSerializer 时,您需要在双方(发送方和接收方)都有 Itsdangerous 库,而TimedJSONWebSignatureSerializer 更灵活,因为 JSON Web 签名格式为standardized。这扩展了用例 TimedJSONWebSignatureSerializer 用于与其他语言编写的软件进行通信,因为它是基于 JSON 格式的,并且有 libs available for many different languages

    事实上,JSON Web Sigbnature 和一般JSON Web Tokens 经常用作授权令牌,但不限于该用例。

    您的示例结果不同有两个原因:

    • JSON Web Signature 格式需要一个 header 和一个 payload 部分,两者都是 JSON 格式,并且 header 还包含一个强制的alg claim,其中

    标识用于保护 JWS 的加密算法。

    • 这两种方法对签名使用不同的加密算法: URLSafeTimedSerializer 默认使用 SHA1

    在内部使用 HMAC 和 SHA1 很危险,(according to the docs)

    TimedJSONWebSignatureSerializer 使用 SHA512,请查看解码后的标头:

    { “alg”:“HS512”, "iat": 1561104545, “经验”:1561108145 }

    后者更长,但也更安全。 (see SHA1 vs. SHA256)

    我希望这能解释这些方法的不同用例和结果。

    顺便说一句。在标题中看到iat(发布于)和exp(到期于)声明是“有趣的”,以前从未见过。通常它们是有效载荷的一部分。 这就提出了一个问题,如果你想要 JWS/JWT 输出,你为什么要使用 Itsdangerous,因为还有许多其他的库可用于此,也适用于 python。

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 2015-03-09
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 2011-03-11
      • 2012-09-22
      相关资源
      最近更新 更多