《使用python来实现json web tokens加密协议》

这两天是北京很冷,远在南方的广东都在下雪,这个冷可想而知了…  

正体开始,我自己在尝试写一个单点登录的小系统,里面权限控制有用到jwt (json web tokens)安全策略,对于jwt,我以前专门写过一篇文章来描述他是怎么一回事, 有兴趣的朋友再瞅瞅.    这次就直接讲解在python下的json web token的实现.  不看rfc协议文档,后面直接看源码更直接一点. 


文章写的不是很严谨,欢迎来喷,另外该文后续有更新的,请到原文地址查看更新。

http://xiaorui.cc/2016/01/24/%E5%9F%BA%E4%BA%8Epython%E7%9A%84json-web-tokensjwt%E5%8A%A0%E5%AF%86%E8%AE%A4%E8%AF%81%E5%AE%9E%E7%8E%B0/

这里额外废话聊聊JWT认证的好处:

跨域: cookies在跨域场景表现并不好。基于Token的方法允许你向任何不同域名的服务器发送Ajax请求.

无状态(或者 服务端可扩展):无须再存储Session,由于Token已经自包含了所有的用户信息。

解耦:无须被绑定在一个特定的验证方案 , 只需要得知是啥加密手法及密钥就可以加密解密。

跨站点脚本攻击:由于没有基于cookie技术,你不再需要考虑跨站点请求的安全性问题。

性能:HMACSH256算法的速度还是很利索的. 在前端下具体的表现性能我没有测过.

JWT格式

JWT是一段被base64url编码过的字符序列,并用点号分隔。它由三部分组成,头部header、载荷playload与签名sign。

另外,Base64是一种编码,也就是说,它是可以被翻译回原来的样子来的。它并不是一种加密过程。

下面是一个JWT头部 Header.  (这里是typ,不是type… 前些日子我测试jwt协议时遇到这个小坑.)

 { 
 ”typ”: “JWT”, 
 ”alg”: “HS256″ 
 } 

下面是一个JWT的消息体 Playload
 { 
 ”blog”: “xiaorui.cc”
 } 

然后把header和playload分别使用base64url编码,接着我们用’ . ‘ 把两个编码后的字符串连接起来,再把这拼接起来的字符串配合密钥进行HMAC SHA-256算法加密,最后再次base64编码下,这就就拿到了签名.   最后把header , playload, 签名用’ . ‘ 连接起来就生成了整个JWT .


请多理解下下面这图.



老规矩,通过学习jot代码看jwt是如何实现的….   大家理解了jwt生成方法就很容易自己构建一个jwt生成器了.   

那么如何验证这个签名是否有效,也就是没有被篡改过?  他的原理也很简单,就是拆分这个JWT,用’ . ‘来拆分出Header , Playload, Sign,然后用base64 decode解码。  第一是判断你根据密钥针对数据加密是否拿到的是同一个签名,第二是判断签名是否过期.

我这里看的是python jot这个库,貌似关注该项目的人不是很多. 

明确的说一点.

payload 的值并没有被加密,就算不知道 secert_key 的值也可以得到 payload 的值。那么签名里的secert_key的意思在于校验是否被篡改数据。

Json Wen Token的实现本来就没啥难度,也就没啥太深聊的了.  需要再次说明的是JWT不能保护数据,但是能防串改,这意思是说,我抓到你非https的jwt包,我是可以看到Header及Playload消息信息的, 如果我抓到了你cookie里的密钥的话,也是可以伪造JWT的。 但话说回来,如果我能嗅觉你的包,你用啥加密也防不住.  还是强烈大家上HTTPS,还是能挡住一些手段的. 



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 }

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!
暂无相关产品