• JWT笔记(2)


    上文对JWT模块进行了一个简单的分析.这篇文章稍微做出一些深入的了解.

    一,Header篡改攻击

    因为JWT的Header是强制有效并且是明文传输(Base64URL编码,几乎等同于明文).那么恶意用户可以很容易地用以下方式进行攻击.

    假设恶意用户Bob按如下的数据结构伪造Token:

    header: {alg:none} payLoad: {user:root}

    生成的Token类似:

    eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyMTIzIiwic2Vzc2lvbiI6ImNoNzJnc2IzMjAwMDB1ZG9jbDM2M2VvZnkiLCJuYW1lIjoiUHJldHR5IE5hbWUiLCJsYXN0cGFnZSI6Ii92aWV3cy9zZXR0aW5ncyJ9.

    注意这个Token是没有signature字段的,它只有header, payload.这个Token的所用的加密算法是none, payLoad是root用户.如果authentication端的代码不够健壮的话,它有可能直接调用JWT库进行解析,从而让这个请求通过验证.

    二, JWT Token生成方法

    JWT Token的头部和payload都是按照baseURL64算法转化而来的,可以理解为是明文,所以关键就是signature.

    其中一个生成方式如下,这个函数的输入是payload和alg,参数payload实际上就是token的header.payload部分.而alg是生成秘钥所采用的

    加密算法,其首先用一个hash类将payload转化为一个hash表,然后调用go语言的库函数.假设加密算法是RS256的话,其最后所调用的

    就是go语言的SignPKCS1v15()函数.这个函数干的事实际上就是rsa加密.

    func (ctx rsaDecrypterSigner) signPayload(payload []byte, alg SignatureAlgorithm) (Signature, error) {
    	var hash crypto.Hash
    	glog.V(1).Infof("gakki we are trying sign %s
    ", string(payload))
    	switch alg {
    	case RS256, PS256:
    		hash = crypto.SHA256
    	case RS384, PS384:
    		hash = crypto.SHA384
    	case RS512, PS512:
    		hash = crypto.SHA512
    	default:
    		return Signature{}, ErrUnsupportedAlgorithm
    	}
    
    	hasher := hash.New()
    
    	// According to documentation, Write() on hash never fails
    	_, _ = hasher.Write(payload)
    	hashed := hasher.Sum(nil)
    	glog.V(1).Infof("the hashed is %#v
    ", hashed)
    	var out []byte
    	var err error
    
    	switch alg {
    	case RS256, RS384, RS512:
    		out, err = rsa.SignPKCS1v15(randReader, ctx.privateKey, hash, hashed)
    	case PS256, PS384, PS512:
    		out, err = rsa.SignPSS(randReader, ctx.privateKey, hash, hashed, &rsa.PSSOptions{
    			SaltLength: rsa.PSSSaltLengthAuto,
    		})
    	}
        	if err != nil {
    		return Signature{}, err
    	}
    	glog.V(1).Infof("the out is %#v
    ", out)
    	return Signature{
    		Signature: out,
    		protected: &rawHeader{},
    	}, nil
    }

    三,jwt和tlsv1.2协议之间的区别

    tlsv1.2协议是https下层的一个安全协议,它的目标是保证信道上所传输的信息的保密性.

    本质上来说,它就是需要将报文进行加密.但是加密过程比较复杂.一个典型的加密过程如下:

    a.Bob生成一组RSA秘钥,他将公钥发送给Alice

    b.Alice持有一个HMAC秘钥,他在收到Bob发送的公钥后,将HMAC秘钥加密,然后发送给Bob

    c.Bob收到Alice的报文后,用他持有的RSA私钥解密,然后这个秘钥加密他想要发送的信息

    d.Alice收到报文后用相同的HMAC秘钥解密.从而得到明文.

    RSA作为非对称加密算法,它的加密解密较为复杂,需要进行大量的计算,不适合处理https通信.

    因此使用RSA算法安全的传输对称加密算法的秘钥,然后再使用对称加密算法完成报文的加密和解密.

    由此可见,tlsv1.2协议和jwt协议有着本质的区别.假设恶意用户窃取了tlsv1.2信道上传输的信息,它是无法获得明文的.而

    如果恶意用户窃取了jwt协议信道上传输的信息,它可以知道通信双方传递的内容,只是它无法伪造信息而已.

    所以jwt协议只能用于身份认证,不能在上面传递敏感信息.

  • 相关阅读:
    课件的引子
    用nc做网络压力测试
    分布式计算学习笔记
    静态库 .a 转成共享库 .so
    nmon用法
    eclipse debug URLClassPath.getLoader(int) file
    sodu 命令场景分析
    俩孩随笔
    深度学习丨深度学习中GPU和显存分析
    语义分割丨DeepLab系列总结「v1、v2、v3、v3+」
  • 原文地址:https://www.cnblogs.com/elnino/p/9135254.html
Copyright © 2020-2023  润新知