python使用json web token (jwt)实现http api的加密传输
2016-09-12 15:23
796 查看
这个一个标准,用来保证数据的安全性的,咱们常用的对于http api加密的方式有这么几种。
文章的原文地址是, http://xiaorui.cc
第一个是使用在HTTP规范中的Basic Auth,这个配置也是相当的简单,在nginx端针对路由location配置下就可以用了 。原理上,客户端必须在每个子响应是附加它们的凭证(credenbtial),包括他的账号和密码 。如果这些凭证通过了,那么用户的信息就会被传递到服务端应用。
requests.get(‘https://api.github.com/user’, auth=(‘user’, ‘pass’))
<Response [200]>
第二个方便是客户端从服务端签收一个加密的key,然后自己通过一定的算法组合加密数据,服务端会根据你的来源解析key。
第三种是OAuth(或者OAuth2)。为第三方的认证所设计,但是更难配置。至少在服务器端更难。
第四种,TOKEN的机制。 在各种客户端上每次都让用户提交用户名和密码,这有些不合理的。 通常的情况是客户端通过一些可靠信息和服务器交换取token,这个token作为客服端再次请求的权限钥匙,当然token也是存在有效时间控制的。 Token通常比密码更加长而且复杂。那么一旦获得了token,在每次调用API的时候都要附加上它。这仍然比直接发送账户和密码更加安全,哪怕是HTTPS。
把token想象成一个安全的护照。你在一个安全的前台验证你的身份(通过你的用户名和密码),如果你成功验证了自己,你就可以取得这个。当你走进大楼的时候(试图从调用API获取资源),你会被要求验证你的护照,而不是在前台重新验证。
第五种,JWT方案,给客户端的是公钥,然后用公钥把数据加密发送给服务端,服务端在根据来源的信息,使用对应的私钥来解析数据。这样就能保证数据的安全性。类似https的方式 JWT里面会含有这么几个字段。
Python
pip install python_jwt 一个jwt的例子,我们可以在一个签发平台上,派发和注册客户端所需要的公钥。 import jwt, Crypto.PublicKey.RSA as RSA, datetime key = RSA.generate(2048) priv_pem = key.exportKey() pub_pem = key.publickey().exportKey() payload = { 'url': 'xiaorui.cc', 'name': 'ruifengyun','level':'low' }; priv_key = RSA.importKey(priv_pem) pub_key = RSA.importKey(pub_pem) token = jwt.generate_jwt(payload, priv_key, 'RS256', datetime.timedelta(minutes=5)) header, claims = jwt.verify_jwt(token, pub_key, ['RS256']) for k in payload: assert claims[k] == payload[k]
这是更详细的用法,我们可以把公钥和密钥放到数据库里面存储,可以通过认证来签发证书 。 看了下模块的作者做了相关的测试, 性能还是不错的。
以后我们就可以给接口传输token,不用怕被截获数据…
Python
In [1]: import jwt, Crypto.PublicKey.RSA as RSA, datetime In [2]: key = RSA.generate(2048) In [3]: priv_pem = key.exportKey() In [4]: pub_pem = key.publickey().exportKey() In [5]: payload = { 'foo': 'bar', 'wup': 90 }; In [6]: priv_key = RSA.importKey(priv_pem) In [7]: pub_key = RSA.importKey(pub_pem) In [8]: token = jwt.generate_jwt(payload, priv_key, 'RS256', datetime.timedelta(minutes=5)) In [9]: token Out[9]: u'eyJhbGciOiAiUlMyNTYiLCAidHlwIjogIkpXVCJ9.eyJ3dXAiOiA5MCwgImp0aSI6ICI2QVk0VUY2N1JBWXBXWkVrbGtPRmZRPT0iLCAiZXhwIjogMTQzMDcyMjExMiwgImlhdCI6IDE0MzA3MjE4MTIsICJmb28iOiAiYmFyIiwgIm5iZiI6IDE0MzA3MjE4MTJ9.Lugwv4tt3uJmccvy3d6YMYbhSttmd6itz_JMdCy44FQH2S6wJHjYUDtx97Ojmpu5n9Wvr6TcF3iejJziatD_cFWwArA9lH2ulqD9y-Cqj_eF01savzEe9yFEOobDUuU-46UfIORNKRqK8OjXfyxX-zWSDXsJOITCO60YyXytj3RTCNZdgzoaQ8m6Ms9hH1eELGsWThII3OCcpv-GJz2gO5owJzEGKxgTqU7YWwu2PaFGvnvvbTVVcAToX1uMVOlBuETAy-XwYEjxZw5ENfscvHi-JcCKeutQ16ItIUtUeQ6780SDNwpHodwXAbHnCjkjbHCPGAbFY7w-6HQk0J7_3w' In [10]: header, claims = jwt.verify_jwt(token, pub_key, ['RS256']) In [11]: header Out[11]: {u'alg': u'RS256', u'typ': u'JWT'} In [12]: claims Out[12]: {u'exp': 1430722112, u'foo': u'bar', u'iat': 1430721812, u'jti': u'6AY4UF67RAYpWZEklkOFfQ==', u'nbf': 1430721812, u'wup': 90}
相关文章推荐
- TCP避免分片
- 马哥Linux网络班作业(6)
- 网络资源的定义--URI,URL,URN
- 使用HttpOnly提升Cookie安全性
- 移植MATLAB神经网络算法到MFC平台
- TCP三次握手 四次挥手全过程
- HTTP 协议入门
- BZOJ3396: [Usaco2009 Jan]Total flow 水流 网络流
- Android公共库——图片缓存 网络缓存 下拉及底部更多ListView 公共类
- TCP/IP(五):TCP 协议详解
- 网络数据包最大长度 MTU 分片
- TCP/IP(四):TCP 与 UDP 协议简介
- HttpClientUtil [使用apache httpclient模拟http请求]
- TCP/IP(三):IP协议相关技术
- TCP/IP(一):数据链路层
- HTTP协议详解
- 拥抱DC2T网络架构-【中国IC微专栏】2016.8.10
- Android Volley完全解析(二),使用Volley加载网络图片
- lighttpd 配置
- 分享一个好用的添加网络代理的工具SocksCap