精华内容
下载资源
问答
  • 什么是token和token是怎么生成的

    千次阅读 2020-08-11 11:30:37
     Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。...

    https://www.cnblogs.com/lufeiludaima/p/pz20190203.html

    什么是token

      Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

      基于 Token 的身份验证

    1. 使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。流程是这样的:
    2. 客户端使用用户名跟密码请求登录
    3. 服务端收到请求,去验证用户名与密码
    4. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
    5. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
    6. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
    7. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
    8. APP登录的时候发送加密的用户名和密码到服务器,服务器验证用户名和密码,如果成功,以某种方式比如随机生成32位的字符串作为token,存储到服务器中,并返回token到APP,以后APP请求时,
    9. 凡是需要验证的地方都要带上该token,然后服务器端验证token,成功返回所需要的结果,失败返回错误信息,让他重新登录。其中服务器上token设置一个有效期,每次APP请求的时候都验证token和有效期。

    token的优势

      1.无状态、可扩展

            在客户端存储的Tokens是无状态的,并且能够被扩展。基于这种无状态和不存储Session信息,负载负载均衡器能够将用户信息从一个服务传到其他服务器上。如果我们将已验证的用户的信息保存在Session中,则每次请求都需要用户向已验证的服务器发送验证信息(称为Session亲和性)。用户量大时,可能会造成  一些拥堵。但是不要着急。使用tokens之后这些问题都迎刃而解,因为tokens自己hold住了用户的验证信息。

      2.安全性

      请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,让我们少了对session操作。token是有时效的,一段时间之后用户需要重新验证。我们也不一定需要等到token自动失效,token有撤回的操作,通过token revocataion可以使一个特定的token或是一组有相同认证的token无效。

      3.可扩展性

      Tokens能够创建与其它程序共享权限的程序。例如,能将一个随便的社交帐号和自己的大号(Fackbook或是Twitter)联系起来。当通过服务登录Twitter(我们将这个过程Buffer)时,我们可以将这些Buffer附到Twitter的数据流上(we are allowing Buffer to post to our Twitter stream)。使用tokens时,可以提供可选的权限给第三方应用程序。当用户想让另一个应用程序访问它们的数据,我们可以通过建立自己的API,得出特殊权限的tokens。

      4.多平台跨域

      我们提前先来谈论一下CORS(跨域资源共享),对应用程序和服务进行扩展的时候,需要介入各种各种的设备和应用程序。Having our API just serve data, we can also make the design choice to serve assets from a CDN. This eliminates the issues that CORS brings up after we set a quick header configuration for our application.只要用户有一个通过了验证的token,数据和资源就能够在任何域上被请求到。Access-Control-Allow-Origin: *

      5.基于标准

      创建token的时候,你可以设定一些选项。我们在后续的文章中会进行更加详尽的描述,但是标准的用法会在JSON Web Tokens体现。最近的程序和文档是供给JSON Web Tokens的。它支持众多的语言。这意味在未来的使用中你可以真正的转换你的认证机制。

    token原理

    展开全文
  • token是由服务器生成的字符串,用作客户端发出请求的token。当第一个会话启动时,服务器生成一个token并将其返回给客户机。将来,客户只需要使用这个token来请求数据,而不需要重新输入用户名和密码。基于token的...

    什么是token?token是由服务器生成的字符串,用作客户端发出请求的token。当第一个会话启动时,服务器生成一个token并将其返回给客户机。将来,客户只需要使用这个token来请求数据,而不需要重新输入用户名和密码。

    基于token的身份验证

    基于token的身份验证方法不需要将用户的登录日志存储在服务器上。过程如下:

    客户端将使用用户名和密码请求登录,并要求服务器确认用户名和密码。

    如果检查成功,服务器将发出一个token并将其作为客户端token发送。在接收到token之后,客户机可以将token存储在cookie或本地存储中。每当客户端从服务器请求资源时,客户端必须向服务器发送token。

    服务器接收请求,然后验证在客户端请求中找到的token。如果验证成功,请求的数据将返回给客户。当应用程序登录时,加密的用户名和密码将发送到服务器。检查用户名和密码。例如,如果以任何方式成功,将随机生成一个32位字符串作为token,存储在服务器上,然后返回到应用程序。请求后,在token中,服务器检查token,成功返回所需结果,返回错误消息失败,可以重新登录。服务器上的token设置为过期,并且在每次应用程序请求时都会进行验证。

    象征性优势

    1。无状态、可扩展

    存储在客户端的token是无状态的和可扩展的。如果不存储这种无状态和会话信息,负载均衡器就可以将用户信息从一个服务传输到另一个服务。在会话中存储经过身份验证的用户信息时,用户必须为每个请求向经过身份验证的服务器发送身份验证信息(称为会话关联)。大量用户可能导致拥塞。但是,不要担心使用token来解决这些问题,因为token包含您的凭据。

    2。安全

    通过在请求中发送token而不是cookie,可以避免CSRF(跨站点请求伪造)。即使客户端使用cookie来存储token,cookie也只是一种存储机制,而不是用于身份验证。减少会话,而不在会话中存储信息。token是紧急的,因此用户需要在一段时间后再次进行身份验证。无需等待token自动过期。token具有恢复操作。token终止可以使具有相同身份验证的特定token或token集失效。

    三。可扩展性

    token可用于创建与其他程序共享权限的程序。例如,您可以将非官方社交账户链接到自己的大账户(Fackbook或Twitter)。

    通过此服务登录Twitter(使用此进程缓冲区)时,可以附加此缓冲区并将其发布到Twitter流。此token允许您为第三方应用程序提供可选权限。

    4。跨平台和跨域

    在提前讨论CORS(域之间的资源交换)和扩展应用程序和服务时,涉及到多个设备和应用程序。

    此标准基于这样一个事实,即您可以在创建token时配置一些选项。稍后我们将记录内容,但标准用法反映在JSONWebtoken中。您可以将最近使用的应用程序和文档用作JSONWebtokens。它是一种兼容的语言。这意味着您可以真正地转换它以供以后使用,并成为一种身份验证机制。

    象征性原则

    base64加密1。有效载荷和标题信息、加密文本和加密表单标题文本。

    点形成的两个密文连接到加密密钥服务器,生成hs256的签名。

    三。文本后面的前两个密码是常规签名。最后一个表单返回到服务器token,请注意:

    (1)此用户token到服务器(分为三部分,第一部分是密文加密负载、签名)。服务器将解密解析为第一部分(第一个密文)和base64。你可以知道签名算法。这是hs256的解决方案。

    (2)服务器hs256操作执行签名签名,签名签名是在使用原始密钥将签名返回到密文(加密的标题文本+'+付费密文)之后获得的。如果token合法,则差异意味着原始文本已被修改。

    (3)第2部分(密码有效负载)由base64确定,以确定解密的到期日期以及客户端是否知道授权期间的有效负载。如果token过期,则将此值与当前时间进行比较。

    展开全文
  • 更多互联网新鲜资讯、工作奇淫技巧关注原创【飞鱼在浪屿】(日更新)基于...密码通过结合身份验证所用服务的密钥和当前时间生成的。这就是为什么代码总是在几秒钟后过期的原因。 如果用过这些应用程序(Twilio Authy...

    更多互联网新鲜资讯、工作奇淫技巧关注原创【飞鱼在浪屿】(日更新)


    1a607ae661631350f50e8418a704bcc1.png

    基于时间的一次性密码(TOTP)算法基本流程

    在最高级别上,您在这些应用上看到的密码是使用TOTP(Time-based One-Time Passwords,基于时间的一次性密码)算法创建的。密码是通过结合身份验证所用服务的密钥和当前时间生成的。这就是为什么代码总是在几秒钟后过期的原因。

    如果用过这些应用程序(Twilio Authy,Google Authenticator,Microsoft Authenticator,这些app都可以在苹果商店/安卓市场下载到),则可能会记得必须在整个过程中的某个地方需要扫描二维码。扫描二维码就是读取二维码的密钥,存到设备存储中。该算法与SIM卡,蜂窝网络提供商或电话的品牌/型号无关,因此比向用户发送验证码应用性更强。该算法的相关因素是当前时间和共享密钥。

    每当在支持TOTP的服务上创建新帐户时,都会为你的用户帐户生成唯一的密码。然后,下次您登录时,该网站将运行客户端运行的相同算法来生成密码。如果来自客户端的密码与服务器生成的密码相匹配,则对用户进行身份验证,并且完成了双重身份验证过程。


    算法如何工作

    让我们看看从头开始实现TOTP服务需要做些什么。

    TOTP是基于HMAC的一次性密码算法(HOTP)构建的,先了解下HMAC。

    HMAC(基于哈希的消息身份验证代码)使用了以下东西:

    • 加密哈希函数(通常为SHA1)
    • 秘密密钥
    • 计数器(客户端和服务器TOTP进程通过计数器保持同步)

    生成唯一的基于时间的身份验证代码。

    TOTP和HOTP / HMAC之间的主要区别在于计数器属性。

    HOTP的计数器通常是事件驱动的,例如,按下按钮会更改计数器的值。

    79ccf788228d5218e8fc606a935b4534.png

    实现HOTP算法的设备

    而在TOTP中,计数器值是基于当前时间戳设置的。

    让我们看一下端到端的流程。

    首先,我们将从时间戳创建一个计数器。为了避免引入额外的复杂性,将使用从纪元开始的时间戳,该时间戳与时区无关。

    4b822e5875729cd2a83ed20027fb5466.png

    使用从纪元开始到现在时间经过了多少个Tx间隔来作为HOTP算法的输入。简而言之,此计算是为了找出用户有多少Tx间隔。

    48d811b378c8042c9b74c1cae445c60f.png

    TOTP的完整流程


    实践

    以下是Swift代码的实现:

     let secretKey = "digitalbunker" let counter = "53283545" let hmacResult: String = secretKey.hmac(algorithm: .SHA1,  counter: counter)

    有了共享密钥secretKey和计数器counter,经过hmac不可逆运算,得到一个哈希值hmacResult(1OyZRjbfhe+8womld8xldXo5V9M=)。

    接下来,将此哈希值转换为十六进制字符串hexString:

    let data = Data(hmacResult.utf8)let hexString = data.map{String(format:"%02x ", $0)}

    hexString现在等于31 4f 79 5a 52 6a 62 66 68 65 2b 38 77 6f 6d 6c 64 38 78 6c 64 58 6f 35 56 39 4d 3d。

    这并不像是用户每次进行身份验证时键入的内容。让可以找到一种更简单的表示方式,6位代码将是一种很好的用户友好选择。

    我们将通过称为动态截断的过程将此哈希值转换为较短的代码。

    动态截断包括获取十六进制字符串最后一个字节的低4位,并将其用作字符串的偏移量,以帮助创建6位代码,同时仍然保持安全。

    最后一个字节是3d指最后4位是十六进制d(十进制13)。

    从偏移量13开始,截取接下来的4个字节:

    31 4f 79 5a 52 6a 62 66 68 65 2b 38 77 6f 6d 6c 64 38 78 6c 64 58 6f 35 56 39 4d 3d

    现在,我们将转换0x6f6d6c64为十进制1869442148。由于只需要一个6位数字的代码,因此我们可以取最后6位数字442148并将其返回给用户。

    现在,服务器将执行3个完全相同的步骤序列。也就是说它将检查当前的30秒间隔,上一个间隔和下一个间隔,以解决时钟不一致问题。如果服务器的代码与用户输入的代码匹配,则对用户进行身份验证通过。


    总结

    攻击者可以像其他密码一样篡改TOTP值,但是攻击者必须几乎客户端和服务端实时地窃取凭据。这加大了被攻击的难度,提升了安全等级。

    如果时间容忍性太大,安全等级会降低。可以缩短代码的TTL。TOTP代码的标准TTL范围从10到30秒不等,以解决时间延迟(客户端和服务器端),不同步的时钟以及用户的易用性。随时调整TTL以满足你的安全需求。但是,如果攻击者能够找到共享密钥,则可以随意创建有效的TOTP代码,也就被攻击到,所以保护好密钥是最重要的事情。


    54cb0f6bb5d5460dbe3be7b93a4ffb94.png
    展开全文
  • 前后端分离或者为了支持多个web应用,那么原来...解决方案oauth2 和 jwt (推荐学习:PHP视频教程)jwt :一种安全标准。基本思路就是用户提供用户名和密码给认证服务器,服务器验证用户提交信息信息的合法性;如果...

    前后端分离或者为了支持多个web应用,那么原来的cookies或者session在使用上就会有很大的问题

    cookie和session认证需要在同一主域名下才可以进行认证(目前可以把session存储在redis内进行解决)。

    8919cf27a788d67ffc6e0f2c641498f7.png

    解决方案

    oauth2 和 jwt (推荐学习:PHP视频教程)

    jwt :是一种安全标准。基本思路就是用户提供用户名和密码给认证服务器,服务器验证用户提交信息信息的合法性;如果验证成功,会产生并返回一个token(令牌)

    OAuth2 :是一个安全的授权框架。它详细描述了系统中不同角色、用户、服务前端应用(比如API),以及客户端(比如网站或移动APP)之间怎么实现相互认证。(这里采用jwt,这种JSON Web Token 这种方式进行认证)

    生成方法

    头部:加密类型

    说明:消息内容

    key:一个随机码用来加密

    上面三部分使用,连接起来,然后使用hs256进行加密,生成tokent

    详细生成方法

    1). 头部通常由两部分组成:令牌的类型(即JWT)和所使用的加密算法(如:SHA256或者RSA){

    "alg": "HS256",

    "typ": "JWT"

    }

    然后,这个json被Base64Url编码,成为第一部分

    2). 有效载荷是声明。声明是关于实体的部分。{

    "exp": "1525785339",

    "sub": "1234567890",

    "name": "John Doe",

    "admin": true

    }

    然后将有效载荷Base64Url进行编码,成为第二部分

    (PS:此信息尽管受到篡改保护,但是任何人都可以阅读。除非加密,否则不要将重要信息放在里面)

    3). 使用一个加密key

    4). 签名,需要使用编码后的第一部分,编码后的第二部分,然后一个关键的key。采用第一部分里的加密算法进行签名HMACSHA256(

    base64UrlEncode(header) "." base64UrlEncode(payload),

    key

    )

    该签名用于验证消息是否有篡改。

    (PHP使用crypt方法进行加密。注意:SHA-256用于防篡改,AES-256用于加密两个概念不一样)

    展开全文
  • 无状态的意思,第一次发送请求登录成功后,第二次发送请求其他接口,服务端不知道你已经登录成功,第二次请求和第一次请求没有任何关联的. Http的这个特性就产生了一个问题,导致登录状态的丢失.于是在每次请求的...
  • 在前后端分离的项目里,我们请求接口的流程一般是:用户使用用户名密码登录信息正确,接口返回token请求需要登录验证的接口,将token放到header里一起请求接口这里介绍一下,在webapi项目里,token是怎么生成的项目...
  • 后端返回 token,在 cookie,header,或者直接在返回的内容中都可以,看你喜欢哪个。我个人比较喜欢直接在返回的内容中,请求的时候直接封装一下请求函数,每次请求的时候把 token 带上。当然,用 cookie 或 header ...
  • 怎么生成?有什么用?本文简单介绍token,并介绍基于token的用户认证方案。Token是什么Token是一个身份凭证,有个很贴切的翻译叫“令牌”。发给你一个令牌,你在遇到关卡的时候出示令牌,证明自己的身份。Token的...
  • 协议,就是请求加响应,尤其我不用记住谁刚刚发了 HTTP 请求,每个请求对我来说都全新的。这段时间很嗨皮2、但是随着交互式 Web 应用的兴起,像在线购物网站,需要登录的网站等等,马上就面临一个问题,那就是...
  • 首先 composer 安装 firebase/php-jwtcomposer require firebase/php-jwt使用当用户登录时,如果有 token 并且没有过期,则得到用户信息,如果 token过期,或者新用户,则生成一个token具体业务自已看着办,这里只...
  • JWT 全称 Json Web token为了在网络应用环境间传递声明而执行的一种基于json的开放标准(RFC 7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和...
  • 本人最近要写一个restful的API,需要token认证,网上都推荐使用JWT做token认证。代码写好了,测试发现生成过程很缓慢,长达1580ms,这个也太慢了吧。没有人觉得性能有问题吗?...大家做API都使用哪种token呢? ...
  • 1204204 最近一直在接触图像生成文本这个东西,看了一些相关的论文,也运行过github上大神们的代码,特别densecap(密集描述网络),觉得很有意义。到了自己下手准备搭建并一定程度复现框架时,感觉还是有一些棘手...
  • 什么是tokenToken是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和...
  • token生成机制

    2020-11-30 19:50:50
    <div><p>请问,jwt.sign({ username: user.id, ...这个底层什么样的生成机制呢? 如果用换成java写的话,怎么写呢?</p><p>该提问来源于开源项目:microsoft/pai</p></div>

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 241
精华内容 96
关键字:

token是怎么生成的