如果您要暴力破解 JWT(这将是一项艰巨的任务,祝您好运),那么您只需直接从前两部分生成签名即可。Python 字典和 JSON 对象是无序结构,因此任何一个顺序都是有效的,JWT 规范没有指定顺序,任何 JWT 实现只需要前两部分的现有数据来验证签名。他们不会重新生成 JSON。
PyJWT 库将所有支持的算法作为jwt.algorithms
模块中的单独对象提供;只需调用jwt.algorithms.get_default_algorithms()
以获取到Algorithm
实例的字典映射名称。
每个这样的对象都有.sign(msg, key)
和.verify(msg, key, sig)
方法。将前两个段(base64 编码,with .
,作为bytes
对象)作为消息传递,您将在使用时获得二进制签名(不是base64 编码).sign()
,或者在使用 验证时.verify()
,您传入解码后的二进制签名来自base64数据。
因此,对于给定token
的bytes
对象,您可以获取算法并使用以下方法验证密钥:
import json
from jwt.utils import base64url_decode
from jwt.algorithms import get_default_algorithms
algorithms = get_default_algorithms()
msg, _, signature_part = token.rpartition(b'.')
header = json.loads(base64url_decode(msg.partition(b'.')[0]))
algo = algorithms[header['alg']]
signature = base64url_decode(signature_part)
# bytes key from other source; brute-force or otherwise
if algo.verify(msg, key, signature):
# key correct
给定您的样本token
并key
设置为b'secret'
,以上验证:
>>> import json
>>> from jwt.utils import base64url_decode
>>> from jwt.algorithms import get_default_algorithms
>>> token = b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzb21lIjoicGF5bG9hZCJ9.EgMnzcJYrElON09Bw_OwaqR_Z7Cq30n7cgTZGJqtK1YHfG1cGnGJoJGwOLj6AWg9taOyJN3Dnqd9NXeTCjTCwA'
>>> key = b'secret'
>>> algorithms = get_default_algorithms()
>>> msg, _, signature_part = token.rpartition(b'.')
>>> header = json.loads(base64url_decode(msg.partition(b'.')[0]))
>>> algo = algorithms[header['alg']]
>>> signature = base64url_decode(signature_part)
>>> algo.verify(msg, key, signature)
True
通过在循环中生成密钥来进行暴力破解是很容易验证的。请注意,除了小键(使用有限的字母)之外的任何东西都将很快变得不可行。即使使用系统编程语言,一个 16 字节的完全随机密钥值(128 位)也需要几十年的时间才能在现代硬件上进行暴力破解,更不用说 Python 循环的速度较慢了。