精华内容
下载资源
问答
  • 登录权限验证token验证的原理和实现

    万次阅读 2018-10-30 21:56:30
    后端不在存储认证信息,而是在用户登录的时候生成一个token,然后返回给前端,前端进行存储,在需要进行验证的时候将token一并发送到后端,后端进行验证 加密的方式:对称加密和非对称加密,对称加密指的是加密解密...

    原理

    后端不在存储认证信息,而是在用户登录的时候生成一个token,然后返回给前端,前端进行存储,在需要进行验证的时候将token一并发送到后端,后端进行验证

    加密的方式:对称加密和非对称加密,对称加密指的是加密解密使用同一个密钥,非对称加密使用公钥和私钥,加密用私钥加密,解密用公钥解密

    主要流程

    1. 用户登录的时候,生成token,token 中应该包含 payload (数据) cert (密钥) 确定加密方式
    2. 返回给前端 cookie,前端进行存储
    3. 前端在进行数据请求的时候发送token到后端
    4. 后端进行token验证,而且进行过期时间的验证

    安装

    安装jsonwebtoken  npm install jsonwebtoken -S

    1.公钥加密 公钥解密

    1.生成秘钥,并以cookie的方式返回前端

    // 对称 加密
    let _payload = { // 钥加密的数据
       userid: _judge_result[0]._id,
       username: _judge_result[0].username,
       level: 8,
       }
    let _cert = 'i love u' // 密钥
    var _token = jwt.sign(_payload, _cert);
    res.cookie('token', _token)//发送cookie

    2.再次请求时,后端解密

    var decoded = jwt.verify(req.cookies.token, 'i love u');

    2.公钥加密 公钥解密

    生成秘钥

    生成私钥:
    
    ssh-keygen -t rsa -b 2048 -f private.key
    
    生成公钥
    
    openssl rsa -in private.key -pubout -outform PEM -out public.key

    1.私钥加密

     // 非对称加密
    let _payload = { // 钥加密的数据
        userid: _judge_result[0]._id,
        username: _judge_result[0].username,
        level: 8,
    }
     // 取出来私钥
     let _private = fs.readFileSync(PATH.resolve(__dirname, '../keys/private.key'))
    
     var _token = jwt.sign(_payload, _private, { algorithm: 'RS256'});//进行加密
     res.cookie('token',_token);//发送给前端

    2.公钥解密

    let _public=fs.readFileSync(PATH.resolve(__dirname,'../keys/public.key'));//获取公钥
    var decoded = jwt.verify(req.cookies.token,_public, {algorithm: 'RS256'});//公钥解密

     

    展开全文
  • 不太明白关于token验证一部分内容:将请求URL、时间戳、token三者进行合并签名,服务端校验有效性。好像微信就是这么做,但是流程上不是特别理解,如果抓包拿到了URL、时间戳、token并且用相同加密方法签名...
  • 主要介绍了PHP token验证生成原理,结合实例形式分析了php的token验证原理与使用技巧,需要朋友可以参考下
  • token验证生成原理

    千次阅读 2019-03-22 17:53:55
    <?... /** * @Author: Ding Jianlong * @Date: 2019-03-20 00:38:01 * @Last Modified by: Ding Jianlong * @Last Modified time: 2019-03...//生成发送请求的验证 token //这里key可以是包含用户信息内容,...
    <?php
    
    /**
     * @Author: Ding Jianlong
     * @Date:   2019-03-20 00:38:01
     * @Last Modified by:   Ding Jianlong
     * @Last Modified time: 2019-03-22 17:50:59
     */
    
    
    //生成发送请求的验证 token
    //这里的key可以是包含用户信息的内容,不用用户+不同的权限
    function makeToken($key){
    	//100秒内有效,不变,时间根据实际需要调整。第三方登录授权15天。
    	return $token = md5($key.sha1(substr(time(),3,7)));
    }
    
    //后台同理验证,
    function checkToken($key,$token){
    	$true = md5($key.sha1(substr(time(),3,7)));
    	if($token == $true){
    		return true;   //token正确
    	}else{
    		return false;
    	}
    }
    
    $key = 'https://github.com/idjl/';
    echo $t = makeToken($key);
    
    var_dump(checkToken($key,'259521122'));
    var_dump(checkToken($key,$t));
    var_dump(checkToken($key,'259521122'));

     

    展开全文
  • token验证原理

    2020-03-20 21:50:41
    token原理:客户端和服务器端身份校验 登录页面输入用户名和密码进行登录 服务器验证通过之后生成该用户的token并返回 客户端存储该token 后续所有请求都携带该token发送 服务器端验证token是否通过 ...
    • token原理:客户端和服务器端身份校验
    1. 登录页面输入用户名和密码进行登录
    2. 服务器验证通过之后生成该用户的token并返回
    3. 客户端存储该token
    4. 后续所有请求都携带该token发送
    5. 服务器端验证token是否通过
    展开全文
  • 来源:www.cnblogs.com/better-farther-world2099一、什么是JWTJson web token (JWT), 是为了在网络应用环境间传递声明而执行一种...

    来源:www.cnblogs.com/better-farther-world2099

    一、什么是JWT

    Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).

    该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。

    JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

    二、JWT的组成

    1、JWT生成编码后的样子

    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.UQmqAUhUrpDVV2ST7mZKyLTomVfg7sYkEjmdDI5XF8Q
    

    2、JWT由三部分构成

    第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).

    header

    jwt的头部承载两部分信息:

    • 声明类型,这里是jwt

    • 声明加密的算法 通常直接使用 HMAC SHA256

    完整的头部就像下面这样的JSON:

    {
      'typ': 'JWT',
      'alg': 'HS256'
    }
    

    然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分

    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
    

    playload

    载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分

    • 标准中注册的声明

    • 公共的声明

    • 私有的声明

    标准中注册的声明 (建议但不强制使用) :

    • iss: jwt签发者

    • sub: jwt所面向的用户

    • aud: 接收jwt的一方

    • exp: jwt的过期时间,这个过期时间必须要大于签发时间

    • nbf: 定义在什么时间之前,该jwt都是不可用的.

    • iat: jwt的签发时间

    • jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

    公共的声明 :

    公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.

    私有的声明 :

    私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。

    定义一个payload:

    {
      "sub": "1234567890",
      "name": "John Doe",
      "admin": true
    }
    

    然后将其进行base64加密,得到Jwt的第二部分

    eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
    

    signature

    jwt的第三部分是一个签证信息,这个签证信息由三部分组成:

    • header (base64后的)

    • payload (base64后的)

    • secret

    这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串(头部在前),然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

    UQmqAUhUrpDVV2ST7mZKyLTomVfg7sYkEjmdDI5XF8Q
    

    密钥secret是保存在服务端的,服务端会根据这个密钥进行生成token和验证,所以需要保护好。

    3、签名的目的

    最后一步签名的过程,实际上是对头部以及载荷内容进行签名。一般而言,加密算法对于不同的输入产生的输出总是不一样的。对于两个不同的输入,产生同样的输出的概率极其地小(有可能比我成世界首富的概率还小)。所以,我们就把“不一样的输入产生不一样的输出”当做必然事件来看待吧。推荐:Java面试练题宝典

    所以,如果有人对头部以及载荷的内容解码之后进行修改,再进行编码的话,那么新的头部和载荷的签名和之前的签名就将是不一样的。而且,如果不知道服务器加密的时候用的密钥的话,得出来的签名也一定会是不一样的。

    服务器应用在接受到JWT后,会首先对头部和载荷的内容用同一算法再次签名。那么服务器应用是怎么知道我们用的是哪一种算法呢?别忘了,我们在JWT的头部中已经用alg字段指明了我们的加密算法了。

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

    注意:在JWT中,不应该在载荷里面加入任何敏感的数据,比如用户的密码。

    4、如何应用

    一般是在请求头里加入Authorization,并加上Bearer标注:

    fetch('api/user/1', {
      headers: {
        'Authorization': 'Bearer ' + token
      }
    })
    

    服务端会验证token,如果验证通过就会返回相应的资源。

    5、安全相关

    • 不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。

    • 保护好secret私钥,该私钥非常重要。

    • 如果可以,请使用https协议

    6、对Token认证的五点认识

    • 一个Token就是一些信息的集合;

    • 在Token中包含足够多的信息,以便在后续请求中减少查询数据库的几率;

    • 服务端需要对cookie和HTTP Authrorization Header进行Token信息的检查;

    • 基于上一点,你可以用一套token认证代码来面对浏览器类客户端和非浏览器类客户端;

    • 因为token是被签名的,所以我们可以认为一个可以解码认证通过的token是由我们系统发放的,其中带的信息是合法有效的;

    三、传统的session认证

    我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据http协议,我们并不能知道是哪个用户发出的请求,所以为了让我们的应用能识别是哪个用户发出的请求,我们只能在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这就是传统的基于session认证。

    但是这种基于session的认证使应用本身很难得到扩展,随着不同客户端用户的增加,独立的服务器已无法承载更多的用户,而这时候基于session认证应用的问题就会暴露出来。推荐:Java面试练题宝典

    基于session认证所显露的问题

    Session: 每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。

    扩展性: 用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。

    CSRF: 因为是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。

    基于token的鉴权机制

    基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。

    流程上是这样的:

    • 用户使用用户名密码来请求服务器

    • 服务器进行验证用户的信息

    • 服务器通过验证发送给用户一个token

    • 客户端存储token,并在每次请求时附送上这个token值

    • 服务端验证token值,并返回数据

    这个token必须要在每次请求时传递给服务端,它应该保存在请求头里, 另外,服务端要支持CORS(跨来源资源共享)策略,一般我们在服务端这么做就可以了 Access-Control-Allow-Origin:*。推荐:Java面试练题宝典

    四、token的优点

    • 支持跨域访问: Cookie是不允许垮域访问的,这一点对Token机制是不存在的,前提是传输的用户认证信息通过HTTP头传输。

    • 无状态(也称:服务端可扩展行):Token机制在服务端不需要存储session信息,因为Token 自身包含了所有登录用户的信息,只需要在客户端的cookie或本地介质存储状态信息。

    • 更适用CDN: 可以通过内容分发网络请求你服务端的所有资料(如:javascript,HTML,图片等),而你的服务端只要提供API即可。

    • 去耦: 不需要绑定到一个特定的身份验证方案。Token可以在任何地方生成,只要在你的API被调用的时候,你可以进行Token生成调用即可。

    • 更适用于移动应用: 当你的客户端是一个原生平台(iOS, Android,Windows 8等)时,Cookie是不被支持的(你需要通过Cookie容器进行处理),这时采用Token认证机制就会简单得多。

    • CSRF:因为不再依赖于Cookie,所以你就不需要考虑对CSRF(跨站请求伪造)的防范。

    • 性能: 一次网络往返时间(通过数据库查询session信息)总比做一次HMACSHA256计算 的Token验证和解析要费时得多。

    • 不需要为登录页面做特殊处理: 如果你使用Protractor 做功能测试的时候,不再需要为登录页面做特殊处理。

    • 基于标准化:你的API可以采用标准化的 JSON Web Token (JWT). 这个标准已经存在多个后端库(.NET, Ruby, Java,Python, PHP)和多家公司的支持(如:Firebase,Google, Microsoft)。

    • 因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。

    • 因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。

    • 便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。

    • 它不需要在服务端保存会话信息, 所以它易于应用的扩展。

    五、JWT的JAVA实现

    Java中对JWT的支持可以考虑使用JJWT开源库;JJWT实现了JWT, JWS, JWE 和 JWA RFC规范;

    下面将简单举例说明其使用:

    1、生成Token码

    import javax.crypto.spec.SecretKeySpec;
    import javax.xml.bind.DatatypeConverter;
    import java.security.Key;
    import io.jsonwebtoken.*;
    import java.util.Date;    
     
    //Sample method to construct a JWT
     
    private String createJWT(String id, String issuer, String subject, long ttlMillis) {
     
    //The JWT signature algorithm we will be using to sign the token
    SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
     
    long nowMillis = System.currentTimeMillis();
    Date now = new Date(nowMillis);
     
    //We will sign our JWT with our ApiKey secret
    byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(apiKey.getSecret());
    Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
     
      //Let's set the JWT Claims
    JwtBuilder builder = Jwts.builder().setId(id)
                                    .setIssuedAt(now)
                                    .setSubject(subject)
                                    .setIssuer(issuer)
                                    .signWith(signatureAlgorithm, signingKey);
     
    //if it has been specified, let's add the expiration
    if (ttlMillis >= 0) {
        long expMillis = nowMillis + ttlMillis;
        Date exp = new Date(expMillis);
        builder.setExpiration(exp);
    }
     
    //Builds the JWT and serializes it to a compact, URL-safe string
    return builder.compact();
    }
    

    2、解码和验证Token码

    import javax.xml.bind.DatatypeConverter;
    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.Claims;
     
    //Sample method to validate and read the JWT
    private void parseJWT(String jwt) {
    //This line will throw an exception if it is not a signed JWS (as expected)
    Claims claims = Jwts.parser()        
       .setSigningKey(DatatypeConverter.parseBase64Binary(apiKey.getSecret()))
       .parseClaimsJws(jwt).getBody();
    System.out.println("ID: " + claims.getId());
    System.out.println("Subject: " + claims.getSubject());
    System.out.println("Issuer: " + claims.getIssuer());
    System.out.println("Expiration: " + claims.getExpiration());
    }
    

    文章整理自:

    • https://blog.csdn.net/buyaoshuohua1/article/details/73739419

    • https://www.cnblogs.com/xiekeli/p/5607107.html#top

    • https://blog.csdn.net/SoftwareOscar/article/details/78538346

    • https://blog.csdn.net/Jack__Frost/article/details/64964208

    • http://blog.leapoahead.com/2015/09/06/understanding-jwt/

    推荐好文
    
    强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!
    
    分享一套基于SpringBoot和Vue的企业级中后台开源项目,代码很规范!
    能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮!
    
    
    
    
    展开全文
  • 本文实例讲述了PHP token验证生成原理。分享给大家供大家参考,具体如下:/*** @Author: Ding Jianlong* @Date: 2019-03-20 00:38:01* @Last Modified by: Ding Jianlong* @Last Modified time: 2019-03-22 17:50:59...
  • 本文实例讲述了PHP token验证生成原理。分享给大家供大家参考,具体如下:/*** @Author: Ding Jianlong* @Date: 2019-03-20 00:38:01* @Last Modified by: Ding Jianlong* @Last Modified time: 2019-03-22 17:50:59...
  • 基于Token的身份验证的原理

    万次阅读 多人点赞 2019-05-06 13:41:32
    目录 1 发展史 2 Cookie ...4.3 基于Token的验证原理 4.5 Tokens优势 参考文献 1 发展史 1、很久很久以前,Web 基本上就是文档浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某...
  • token验证技术的原理和简单实现

    万次阅读 2018-12-14 09:37:38
    为什么使用Token验证:  在Web领域基于Token身份验证随处可见。在大多数使用Web API互联网公司中,token是多用户下处理认证最佳方式。  以下几点特性会让你在程序中使用基于Token身份验证  1.无状态、可...
  • 1.django是怎么验证csrfmiddlewaretoken合法性? 2.每次刷新页面时候中csrfvalue都会更新,每次重复登录时候cookiecsrf令牌都会刷新,那么这两个csrf-token有什么区别 CSRF简称跨站请求伪造 django第一次...
  • 2. 服务端验证用户名密码是否正确,校验通过就会生成一个有时效的token串,发送给客户端 3. 客户端储存token,一般都会存储在localStorage或者cookie里面(vue...5. 服务端验证token,所有需要校验身份接口都会被校...
  • 基于Token的身份验证的过程有什么?作为网络协议相关内容知识点,Token是Linux运维和网络安全工程师需要了解的内容。随着市场对网络安全需求的增加,许多人看中了网络安全广阔的发展前景,开始转而学习网络安全技能...
  • TOKEN验证防止CSRF攻击的原理。CSRF中文名是跨站请求伪造攻击,黑客可以通过CSRF攻击来伪造我们的身份,从而进行不法的活动。比如说是以我们的身份进行转账,发送邮件等操作。 要想做到预防CSRF攻击,首先需要了解...
  • 要找到一个适用于接口验证的方式,公司仍保持后端使用Laravel框架,而laravel框架默认的是【web】方式,web 方式是使用 session 来进行用户认证,当然也是可以使用,但是有一定的不安全,经过调研,主流使用的Token...
  • Node登录权限验证token验证实现

    千次阅读 2019-06-28 11:43:24
    Node登录权限验证token验证的原理和实现 1. token的使用场景 无状态请求 保持用户的登录状态 第三方登录(token+auth2.0) 2. 基于token的验证原理 后端不再存储认证信息,而是在用户登录的时候生成一个token,...
  • django 第一次响应来自某个客户端请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token, 这样就能避免被 CSRF 攻击。 这样子看起来似乎没毛病,但是评论...
  • 众所周知,django通过CsrfViewMiddleware中间件来下发和校验csrf-token有效性。 那么,这个中间到底是怎么实现token校验呢? 首先,django 第一次响应来自某个客户端请求时,会在服务器端随机生成一个 csrf...
  • 微信接口token验证和消息回复原理,其中有详细注释说明,帮助您理解微信接口实现,和实现消息回复,是微信接口开发入口,可是先自动回复机器人开发。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 881
精华内容 352
关键字:

token验证的原理