你网站正确使用JSON Web令牌(JWT)了吗?

对于不太熟悉的JSON Web令牌(JWT)的开发者,可以简单理解为JSON Web令牌(JWT)是用于创建声明的令牌。例如,服务器可以生成一个令牌,该令牌具有“以管理员身份登陆”的声明,并将其提供给客户端。然后,客户端可以使用该令牌来证明他们以管理员身份登陆,令牌由服务器的密钥签名,因此服务器能够验证令牌是合法的。

你网站正确使用JSON Web令牌(JWT)了吗?

​JWT通常包含三部分:标头,有效负载和签名。

标头用于生成签名的算法,如下所示:

header = '{"alg":"HS256","typ":"JWT"}'

HS256指示此令牌是使用HMAC-SHA256签名。

payload = '{"loggedInAs":"admin","iat":1422779638}'

根据JWT规范中所建议,有效负载包括时间戳iat(issued at)

签名是通过base64url对报头和有效负载进行编码并以句点作为分隔符将它们连接起来来计算的:

key = 'secretkey'unsignedToken = encodeBase64(header) + '.' + encodeBase64(payload)signature = HMAC-SHA256(key, unsignedToken)

总而言之,我们签名进行base64url编码,并使用句点将这三个部分结合在一起,如下:

token = encodeBase64(header) + '.' + encodeBase64(payload) + '.' + encodeBase64(signature)# token is now:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

而JSON Web令牌(JWT)本身就有漏洞,第一是公开密钥数据token值。

在前端获取token值时,只能保存公共文件或公共内容中,因为每次访问都要提供token值以保证能与服务token值一致。

第二是多数开发者习惯使用对称算法加密来验证数据的正确性。

当然很多开发者也针对其做其他防范措施,比如token值保存在数据中,每次客服端访问都要验证数据库token值是否一致等。

目前官方也有更新如何更好使用JWT防止漏洞,如果想更好使用JWT,可以自己查阅官方最新资料。



分享到:


相關文章: