为什么不推荐用JWT保护你的Web应用

为什么不推荐用JWT保护你的Web应用,第1张

上一篇文字,简单的介绍了restful项目的安全方案,有提到jwt的方式,但是不推荐使用jwt来保护web应用,记住是web应用。为什么呢?

认证 / 授权

认证解决了「你是谁」的问题。

授权解决了「你能做什么」的问题。

对于一般的web应用,我们知道 >

在前一篇 笔记 中我们验证了使用sa的token作为一种认证,向apiserver发送请求,这里简述下它的认证原理和流程。

首先得知道这种token称为JWT(json web token),可以参考 官网 介绍,而且这是一种 RFC 标准。

JWT是服务端发给客户端的一种加密凭证(通过RSA或者密码加密),客户端访问服务端(此不一定是发布凭证的服务端)时携带上这个凭证,服务端解密此凭证,验证通过就可以允许客户端访问。

在k8s中,使用RSA私钥/公钥进行加密和验证,kube-controller-manager,使用如下参数指定私钥,对token进行签名

kube-apiserver使用如下参数指定公钥,对token进行验证

JWT包含三部分,分别为: Header,Payload,Signature,之间用""分隔,所以一般形式为xxxyyyzzz。

header

一般包含两部分, typ指定了类型,固定为"JWT",alg指定了签名算法, 比如HMAC SHA256 or RSA。

payload

定义了用户数据,有定义好的知名的 字段 ,也可以自定义字段

payload需要使用Base64Url 加密后,作为JWT的第二部分

Signature

签名这一步需要四个条件:Base64Url 加密后的header,Base64Url 加密后的paload,secret(可以是密码,也可以是RSA的私钥)和header中指定的加密算法。比如使用 RSASHA256 算法计算签名的公式如下:

上面公式执行时,大概分为两步:

最后将这三部分(都要经过base64加密)使用""结合起来就是最终的token

上面只是简述原理和流程,这里实践如何生成JWT,如何验证JWT。

有两种方法来生成/验证JWT

a 使用 jwtio 官方提供的 图形界面

b 使用第三方库,比如python中的jwt (pip install python-jwt 通过此命令安装)

生成JWT

在右侧的decoded下面的三个框分别填写header,payload和VERIFY SIGNATURE中的private key(对于k8s来说,私钥就是/etc/kubernetes/pkt/sakey),最上面的Algorithm选择签名算法,这里选择rs256 会自动在左侧的encoded框显示出生成的JWT,如下图

解密JWT

把JWT填写到左侧的encoded中,系统会自动识别出header和payload,因为他俩是base64加密的,直接解密即可,但是签名部分需要提供公钥才能进行验证,否则encoded框下面会显示红色的"Invalid Signature",只要把公钥(对于k8s来说,公钥就是/etc/kubernetes/pkt/sapub),填写到右侧decoded下面的VERIFY SIGNATURE框的public key处即可验证,如下图

没填写公钥时

填写正确的公钥后

如下是python脚本,使用jwt库生成JWT,并验证JWT

使用python3执行脚本(为什么使用python3?原因在下面),查看结果

使用python库时有两点需要注意

下面内容是python调试内容,可忽略。

sha256生成的hash值

(Pdb) p data

b'\x9e ,\x86\xd2g74\xed\xdbo\x14\xaa\x02b\xd6\x01a\xa6\xde\xfb\x82\xd0,\xe0\x14\xde\x82\xbe\xde\xed\x97'

(Pdb) len(data)

32

(Pdb) print(datahex())

9e2a2c86d2673734eddb6f14aa0262d60161a6defb82d02ce014de82bedeed97

(Pdb) print(data)

b'\x9e ,\x86\xd2g74\xed\xdbo\x14\xaa\x02b\xd6\x01a\xa6\xde\xfb\x82\xd0,\xe0\x14\xde\x82\xbe\xde\xed\x97'

/usr/lib/python3/dist-packages/jwt/api_jwspy

alg_obj = self_algorithms[algorithm]

key = alg_objprepare_key(key)

signature = alg_objsign(signing_input, key)

以上就是关于为什么不推荐用JWT保护你的Web应用全部的内容,包括:为什么不推荐用JWT保护你的Web应用、Token和Jwt存在什么区别、k8s之 service account token等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10137037.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存