发表于: 2018-06-10 23:31:09

1 891


今日完成:

#登录验证加密


登录验证的主要包括两个方面:

1.password的加密,因为出于防止数据库被盗,导致密码泄露,对数据库提交的密码,进行加密处理。这一步应该JSP页面中实现,同时是密码的加密应该要是不可逆的

所用算法:mod5+salt


2.用户状态的标识信息,通常有生成token存入cookie实现功能实现

token的生成

首先搞明白这个token的作用就是一个令牌,用来标记一个用户的身份。那么首先他要唯一。其次他从客户端上传后,服务端能够验证这个token是由服务端生成的。

所以token生成只要满足以上目的,你随意就好了。当然别把敏感信息暴露出去了。

常用的一种生成方式:

  1. 该用户的uid,如:8888
  2. 该用户的口令,如: 123123
  3. 用户对应的salt,如:abcd
  4. 过期时间戳,如:1468293948

把上面几部分拼接起来:888:123123:abcd:1468293948

token = md5(‘888:123123:abcd:1468293948’);

token的验证

对于token也有两种方法进行验证。一是:服务端生成后,将token保存起来(redis或者mysql中)。客户端穿上来之后,检查是否有该token,如果有取出对应的信息,比如uid,验证是否匹配。

另一种方法是:根据上传的uid,生成对应的token,然后进行比较token结果是否一致(要保障该算法如果给定的值一定,结果必须唯一。常用md5)。


基于JWT 的token实现

编写工具类

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;
import java.util.Date;

/**
* 用来生成token令牌和解码验证token令牌
* JWT由三部分组成,头部header、载荷payload与签名signature
*/
public class JwtUtil {
   private static final String apiKey ="ApiKey" //加密密钥
   /**
    * 生成Token令牌
    * @param id  发布者Id
    * @param issuer 发布者
    * @param subject 发布主题
    * @param ttlMillis 有效期时长
    * @return 返回JWT
    */
   public String createJwt(String id,String issuer,String subject,long ttlMillis){
       //签名算法使用SHA256算法加密
       SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

       //获取当前时间
       long nowMillis = System.currentTimeMillis();
       Date nowDate = new Date(nowMillis);

       //加密JWT
       byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(apiKey);
       Key signingKey = new SecretKeySpec(apiKeySecretBytes,signatureAlgorithm.getJcaName());

       //设置JWT声明格式
       JwtBuilder jwtBuilder = Jwts.builder().setId(id)
               .setIssuedAt(nowDate) //发布时间
               .setSubject(subject)  //发布主题
               .setIssuer(issuer)  //发布者
               .signWith(signatureAlgorithm,signingKey)//签名方式及签名密钥

       if(ttlMillis>=0){//添加有效期
           long expMillis = nowMillis + ttlMillis//过期时间
           Date exp = new Date(expMillis);
           jwtBuilder.setExpiration(exp);
       }
              return jwtBuilder.compact()//返回JWT
   }

   /**
    * 解析和验证token信息
    * @param jwt JWT信息
    */
   public void parseJwt(String jwt){
       Claims claims = Jwts.parser()
               .setSigningKey(DatatypeConverter.parseBase64Binary(apiKey))
               .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());
   }
}


明日计划:

继续验证环节

困难:

null

收获:

jwt的实现


返回列表 返回列表
评论

    分享到