json web token 的生成过程和原理

JSON Web Token (JWT)在web应用间安全地传递信息,允许我们使用JWT在用户和服务器之间传递安全可靠的消息。
假如当A用户关注了B用户的时候,系统发送邮件给B用户,并且附有一个链接“点此关注A用户”。链接的地址可以是这样的

https://your.awesome-app.com/make-friend/?from_user=B&target_user=A

主要通过URL来描述,这样做就要求B用户一定要先登录的,JWT允许我们简化这个流程,让B用户不用登录就可以完成这个操作。
JWT的组成
一个JWT实际上就是一个字符串,由三部分组成,头部header,消息体playload,与签名sign。
JWT 的头部header就是json格式:
{
“typ”:“JWT”,
“alg”:“HS256”,
“exp”:1491066992916
}
其中typ是type的简写,代表是JWT的类型,加密方式是HS256,exp代表是当前时间。对他也要进行base64的编码,之后的字符串就成了JWT的header(头部)

JWT的消息体playload
{

“iss”:“companyname”,
“iat ”:1441593502,
“exp”:141594722,
“aud”: “www.example.com”,
“sub”: “irocket@example.com”,
“from_user”: “B”,
“target_user” :”A”
}
这五个字段都是由JWT的标准所定义的
iss: 该JWT的签发者
sub:该JWT所面向的用户
aud:接受该JWT的一方
exp:什么时候过期,这里也是一个时间戳
iat:什么时候签发的,也是一个时间戳
同样将json对象进行base64的编码,解密的时候要拿字段的key值获取value

JWT的签名sign的组成
最后是签名,签名的生成就是把header和playload编码后的字符串用.连接起来,(头部在前),再把拼接起来的字符串配合密钥进行HMAC SHA-256算法加密,最后再次使用base64编码,这就拿到了签名sign,最后将header和playload和sign用.连接起来,就生成整个JWT了
于是,我们就可以将邮件中的URL改成

https://your.awesome-app.com/make-friend/?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM

这样就可以安全地完成添加好友的操作了!
服务器应用在接受到JWT后,会首先对头部和载荷的内容用同一算法再次签名。那么服务器应用是怎么知道我们用的是哪一种算法呢?别忘了,我们在JWT的头部中已经用alg字段指明了我们的加密算法了。

如果服务器应用对头部和载荷再次以同样方法签名之后发现,自己计算出来的签名和接受到的签名不一样,那么就说明这个Token的内容被别人动过的,我们应该拒绝这个Token,返回一个HTTP 401 Unauthorized响应

信息会暴露?
是的。

所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。

但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。
JWT的适用场景:
其实JWT还经常用于设计用户认证和授权系统,甚至实现Web应用的单点登录
检验简介:
加密:
比如要加密验证的是userid字段,首先按前面的格式组装json消息头header和消息体playload,按header.playload组成字符串,再根据密钥和HS256加密header.playload得到sign签名,最后得到jwtToken为header.playload.sign,在http请求中的url带上参数想后端服务请求认证。
解密:
后端服务校验jwtToken是否有权访问接口服务,进行解密认证,如校验访问者的userid,首先
用将字符串按.号切分三段字符串,分别得到header和playload和sign。然后将header.playload拼装用密钥和HAMC SHA-256算法进行加密然后得到新的字符串和sign进行比对,如果一样就代表数据没有被篡改,然后从头部取出exp对存活期进行判断,如果超过了存活期就返回空字符串,如果在存活期内返回userid的值。
http://blog.leapoahead.com/2015/09/06/understanding-jwt/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值