美文网首页
pyjwt jwt.exceptions.InvalidAlgo

pyjwt jwt.exceptions.InvalidAlgo

作者: 愤愤的有痣青年 | 来源:发表于2020-07-01 15:26 被阅读0次

    在使用pyjwt==1.7.1模块进行加解密时,使用RS256算法出现jwt.exceptions.InvalidAlgorithmError: Algorithm not supported异常,如下:

    >>>jwt.decode(params, public_key, algorithm='RS256')
    Traceback (most recent call last):
      File "/usr/local/lib/python3.5/dist-packages/jwt/api_jws.py", line 219, in _verify_signature
        alg_obj = self._algorithms[alg]
    KeyError: 'RS256'
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/local/lib/python3.5/dist-packages/jwt/api_jwt.py", line 92, in decode
        jwt, key=key, algorithms=algorithms, options=options, **kwargs
      File "/usr/local/lib/python3.5/dist-packages/jwt/api_jws.py", line 156, in decode
        key, algorithms)
      File "/usr/local/lib/python3.5/dist-packages/jwt/api_jws.py", line 226, in _verify_signature
        raise InvalidAlgorithmError('Algorithm not supported')
    jwt.exceptions.InvalidAlgorithmError: Algorithm not supported
    

    大致意思是没有RS256算法,通过查看源码,发现在算法列表处有如下代码:

    try:
        from cryptography.hazmat.primitives import hashes
        from cryptography.hazmat.primitives.serialization import (
            load_pem_private_key, load_pem_public_key, load_ssh_public_key
        )
        from cryptography.hazmat.primitives.asymmetric.rsa import (
            RSAPrivateKey, RSAPublicKey, RSAPrivateNumbers, RSAPublicNumbers,
            rsa_recover_prime_factors, rsa_crt_dmp1, rsa_crt_dmq1, rsa_crt_iqmp
        )
        from cryptography.hazmat.primitives.asymmetric.ec import (
            EllipticCurvePrivateKey, EllipticCurvePublicKey
        )
        from cryptography.hazmat.primitives.asymmetric import ec, padding
        from cryptography.hazmat.backends import default_backend
        from cryptography.exceptions import InvalidSignature
    
        has_crypto = True
    except ImportError:
        has_crypto = False
    
    requires_cryptography = set(['RS256', 'RS384', 'RS512', 'ES256', 'ES384',
                                 'ES521', 'ES512', 'PS256', 'PS384', 'PS512'])
    
    
    def get_default_algorithms():
        """
        Returns the algorithms that are implemented by the library.
        """
        default_algorithms = {
            'none': NoneAlgorithm(),
            'HS256': HMACAlgorithm(HMACAlgorithm.SHA256),
            'HS384': HMACAlgorithm(HMACAlgorithm.SHA384),
            'HS512': HMACAlgorithm(HMACAlgorithm.SHA512)
        }
    
        if has_crypto:
            default_algorithms.update({
                'RS256': RSAAlgorithm(RSAAlgorithm.SHA256),
                'RS384': RSAAlgorithm(RSAAlgorithm.SHA384),
                'RS512': RSAAlgorithm(RSAAlgorithm.SHA512),
                'ES256': ECAlgorithm(ECAlgorithm.SHA256),
                'ES384': ECAlgorithm(ECAlgorithm.SHA384),
                'ES521': ECAlgorithm(ECAlgorithm.SHA512),
                'ES512': ECAlgorithm(ECAlgorithm.SHA512),  # Backward compat for #219 fix
                'PS256': RSAPSSAlgorithm(RSAPSSAlgorithm.SHA256),
                'PS384': RSAPSSAlgorithm(RSAPSSAlgorithm.SHA384),
                'PS512': RSAPSSAlgorithm(RSAPSSAlgorithm.SHA512)
            })
    
        return default_algorithms
    

    可以看到当has_cryptoFalse时只有默认的HS256, HS384,HS512三种加密算法,而其为False的条件是from cryptography.xxx发生了异常,因此可以判断是没有cryptography模块导致的,因此执行

    pip install cryptography

    即解决问题

    相关文章

      网友评论

          本文标题:pyjwt jwt.exceptions.InvalidAlgo

          本文链接:https://www.haomeiwen.com/subject/qxthqktx.html