python token_python使用json web token (jwt)实现http api的加密传输

什么是json web token (jwt), 这个一个协议安全的标准,用来保证数据的一致性及安全性的。 这次说下加jwt的非对称加密方式. 注: rsa的性能很烂…

先聊聊,咱们常用的对于http api加密的方式有哪几种?

另外还有一篇python jwt的详细文章

第一个是使用在HTTP规范中的Basic Auth,这个配置也是相当的简单,在nginx端针对路由location配置下就可以用了 。原理上,客户端必须在每个子响应是附加它们的凭证(credenbtial),包括他的账号和密码 。如果这些凭证通过了,那么用户的信息就会被传递到服务端应用。 后来随着nginx lua的发展,更多人喜欢在lua层面做权限的控制,比如http请求加入header头,加入cookie等。

requests.get('https://api.xiaorui.cc/user', auth=('user', 'pass'))

第二个方便是客户端从服务端签收一个加密的key,然后自己通过一定的算法组合加密数据,服务端会根据你的来源解析key。

第三种是OAuth(或者OAuth2)。为第三方的认证所设计,但是更难配置。至少在服务器端更难。

第四种,TOKEN的机制。 在各种客户端上每次都让用户提交用户名和密码,这有些不合理的。 通常的情况是客户端通过一些可靠信息和服务器交换取token,这个token作为客服端再次请求的权限钥匙,当然token也是存在有效时间控制的。 Token通常比密码更加长而且复杂。那么一旦获得了token,在每次调用API的时候都要附加上它。这仍然比直接发送账户和密码更加安全,哪怕是HTTPS。

把token想象成一个安全的护照。你在一个安全的前台验证你的身份(通过你的用户名和密码),如果你成功验证了自己,你就可以取得这个。当你走进大楼的时候(试图从调用API获取资源),你会被要求验证你的护照,而不是在前台重新验证。

第五种,jwt方法,JWT是一段被base64url编码过的字符序列,并用点号分隔。它由三部分组成,头部header、载荷playload与签名sign。 服务端和客户端都可以通过secret_key来识别信息是否被串改过.

这里的secert_key是用rsa的方法,你也可以自定义key。

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]

这是更详细的用法,我们可以把公钥和密钥放到数据库里面存储,可以通过认证来签发证书 。

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}

总结,我这对于jwt就说这么多了。 如果不想使用这种rsa的非对称方式,可以直接写死secret key.

大家觉得文章对你有些作用!

如果想赏钱,可以用微信扫描下面的二维码,感谢!

另外再次标注博客原地址 xiaorui.cc

weixin_new.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值