上一篇文字,简单的介绍了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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)