token验证_token验证错误怎么办

广告 X
欧意最新版本

欧意最新版本

欧意最新版本app是一款安全、稳定、可靠的数字货币交易平台。

APP下载  官网地址

Python token及token验证

注意

token及token验证

涉及模块hmac与base64

hmac模块

简介

HMAC是密钥相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出

典型应用

安全性 

由上面的介绍,我们可以看出,HMAC算法更象是一种加密算法,它引入了密钥,其安全性已经不完全依赖于所使用的HASH算法,安全性主要有以下几点保证:

(1) 使用的密钥是双方事先约定的,第三方不可能知道。作为非法截获信息的第三方,能够得到的信息只有作为“挑战”的随机数和作为“响应”的HMAC结果,无法根据这两个数据推算出密钥。由于不知道密钥,所以无法仿造出一致的响应。

生产token

原理:

通过hmac sha1 算法产生用户给定的key和token的最大过期时间戳的一个消息摘要,将这个消息摘要和最大过期时间戳通过”:”拼接起来,再进行base64编码,生成最终的token

import time

import base64

import hmac

def generate_token(key, expire=3600):

"""

:param key: str (用户给定的key,需要用户保存以便之后验证token,每次产生token时的key 都可以是同一个key)

:param expire: int(最大有效时间,单位为s)

:return: state: str

"""

ts_str = str(time.time() + expire)

ts_byte = ts_str.encode("utf-8")

sha1_tshexstr = hmac.new(key.encode("utf-8"), ts_byte, 'sha1').hexdigest()

token = ts_str + ':' + sha1_tshexstr

b64_token = base64.urlsafe_b64encode(token.encode("utf-8"))

return b64_token.decode("utf-8")

ret = generate_token("1234566788")

print(ret)

验证token

原理

将token进行base64解码,通过token得到token最大过期时间戳和消息摘要。判断token是否过期。 如没过期才将 从token中的取得最大过期时间戳进行hmac sha1 算法运算(注意这里的key要与产生token的key要相同),最后将产生的摘要与通过token取得消息摘要进行对比, 如果两个摘要相等,则token有效,否则token无效 。

def certify_token(key, token):

"""

:param key: str

:param token: str

:return: boolean

"""

token_str = base64.urlsafe_b64decode(token).decode('utf-8')

token_list = token_str.split(':')

if len(token_list) != 2:

return False

ts_str = token_list[0]

if float(ts_str) < time.time():

# token expired

return False

known_sha1_tsstr = token_list[1]

sha1 = hmac.new(key.encode("utf-8"), ts_str.encode('utf-8'), 'sha1')

calc_sha1_tsstr = sha1.hexdigest()

if calc_sha1_tsstr != known_sha1_tsstr:

# token certification failed

return False

# token certification success

return True

key = '1234566788'

token = 'MTUzMTc0NDU2OS43OTEzNjg3OjVkZjllNGIyZDgzMmNlYWU2YmRjOGFhMzk2M2Q4NWJmOGVjZTI5YmE=' certify_token(key, token)

基于token的多平台身份认证架构设计

作者:哈莫

在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情。

随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格局 。

不同的客户端产生了不同的用户使用场景,这些场景:

综上所述,它们的身份认证方式也存在一定的区别。

本文将使用一定的篇幅对这些场景进行一些分析和梳理工作。

下面是一些在IT服务常见的一些使用场景:

通过对场景的细分,得到如下不同的认证token类别:

1、原始账号密码类别

2、会话ID类别

3、接口调用类别

不同场景的token进行如下几个维度的对比:

天然属性对比:

1、使用成本

本认证方式在使用的时候,造成的不便性。比如:

2、变化成本

本认证方式,token发生变化时,用户需要做出的相应更改的成本:

环境风险

可调控属性对比:

1、使用频率

在网路中传送的频率

2、有效时间

此token从创建到终结的生存时间

安全和隐私性主要体现在:

关于隐私及隐私破坏后的后果,有如下的基本结论:

遵守如下原则:

将各类token的固有特点及可控属性进行调控后, 对每个指标进行量化评分(1~5分),我们可以得到如下的对比表:

参考上一节的对比表,可以很容易对这些不同用途的token进行分层,主要可以分为4层:

token的分层图如下:

在一个多客户端的信息系统里面,这些token的产生及应用的内在联系如下:

token验证_token验证错误怎么办

使用如上的架构有如下的好处:

4.1、账号密码

广义的 账号/密码 有如下的呈现方式:

它们的特点如下:

1、会有特别的意义

比如:用户自己为了方便记忆,会设置有一定含义的账号和密码。

2、不常修改

账号密码对用户有特别含义,一般没有特殊情况不会愿意修改。 而app_id/app_key则会写在应用程序中,修改会意味着重新发布上线的成本

3、一旦泄露影响深远

正因为不常修改,只要泄露了基本相当于用户的网络身份被泄露,而且只要没被察觉这种身份盗用就会一直存在

所以在认证系统中应该尽量减少传输的机会,避免泄露。

4.2、客户端会话token

功能:

充当着session的角色,不同的客户端有不同的生命周期。

使用步骤:

用户使用账号密码,换取会话token

不同的平台的token有不同的特点:

Web平台生存周期短

主要原因:

移动端生存周期长

主要原因:

4.3、access_token

功能:

服务端应用程序api接口访问和调用的凭证。

使用步骤:

使用具有较长生命周期的会话token来换取此接口访问token。

其曝光频率直接和接口调用频率有关,属于高频使用的凭证。 为了照顾到隐私性,尽量减少其生命周期,即使被截取了,也不至于产生严重的后果。

4.4、pam_token

功能:

由已经登录和认证的PC端生成的二维码的原始串号(Pc Auth Mobile)。

主要步骤如下:

4.5、map_token

功能:

由已经登录的移动app来扫码认证PC端系统,并完成PC端系统的登录(Mobile Auth Pc)。

主要步骤:

本文所设计的基于token的身份认证系统,主要解决了如下的问题:

本文中提到的设计方法,在 应用层 中可以适用于且不限于如下场景中:

至于更多的使用场景,就需要大家去发掘了。

跨域身份验证解决方案:基于JWT实现Token认证

在前后端分离的应用中,使用Token进行认证是一种较为常见的方式。但是,由于Token的有效期限制,需要不断刷新Token,否则会导致用户认证失败。为了解决这个问题,可以实现无感知刷新Token的功能,本文将介绍如何实现无感知刷新Token。

在Web应用中,常见的Token认证方式有基于Cookie和基于Token的认证。基于Cookie的认证方式是将认证信息保存在Cookie中,每次请求时将Cookie发送给服务器进行认证;而基于Token的认证方式是将认证信息保存在Token中,每次请求时将Token发送给服务器进行认证。

在基于Token的认证方式中,客户端将认证信息保存在Token中,而不是保存在Cookie中。在认证成功后,服务器将生成一个Access Token和一个Refresh Token,并将它们返回给客户端。Access Token用于访问受保护的API,Refresh Token用于获取新的Access Token。

无感知刷新Token是指,在Token过期之前,系统自动使用Refresh Token获取新的Access Token,从而实现Token的无感知刷新,用户可以无缝继续使用应用。

在实现无感知刷新Token的过程中,需要考虑以下几个方面:

下面将介绍如何实现无感知刷新Token的具体步骤。

在认证成功后,需要将Access Token和Refresh Token发送给客户端。Access Token用于访问受保护的API,Refresh Token用于获取新的Access Token。可以使用JWT(jsON Web Token)或OAuth2(开放授权)等方式实现认证。

在JWT中,可以使用如下代码生成Access Token和Refresh Token:

在每个需要认证的API请求中,需要在请求头中携带Access Token,如下所示:

在前端中,可以使用AxIOS等库设置请求头:

在服务器返回401 Unauthorized响应时,说明Access Token已经过期,需要使用Refresh Token获取新的Access Token。可以使用Axios或Fetch API的中间件实现拦截。

在Axios中,可以使用如下代码实现:

在Fetch中,可以使用如下代码实现中间件:

在上述代码中,使用Axios或Fetch拦截401 Unauthorized响应,如果发现Access Token已经过期,则发送Refresh Token请求获取新的Access Token,并将新的Access Token设置到请求头中,重新发送请求。

在服务器端,需要编写API处理Refresh Token请求,生成新的Access Token,并返回给客户端。

在JWT中,可以使用如下代码生成新的Access Token:

在刷新Token时,需要验证Refresh Token的合法性,可以使用如下代码验证Refresh Token:

在上述代码中,使用JWT的verify方法验证Refresh Token的合法性,如果验证成功,则生成新的Access Token和Refresh Token,并返回给客户端。

为了避免Access Token过期时间太长,可以设置定时刷新Token的功能。可以使用定时器或Web Workers等方式实现定时刷新Token。在每次刷新Token时,需要重新获取新的Access Token和Refresh Token,并保存到客户端。

在上述代码中,使用定时器每14分钟刷新Token。在刷新Token成功后,将新的Access Token和Refresh Token保存到客户端,并将新的Access Token设置到请求头中。

在实现无感知刷新Token的过程中,需要考虑到Refresh Token的安全性问题。因为Refresh Token具有长期的有效期限,一旦Refresh Token被泄露,攻击者就可以使用Refresh Token获取新的Access Token,从而绕过认证机制,访问受保护的API。

为了增加Refresh Token的安全性,可以考虑以下几种措施:

上一篇: brc包装材料认证一般多少钱,产品包装认证
下一篇: 比特币VS竞争币:到底谁才是加密货币的未来?

为您推荐