发表于: 2018-06-10 23:31:09
1 891
今日完成:
#登录验证加密
登录验证的主要包括两个方面:
1.password的加密,因为出于防止数据库被盗,导致密码泄露,对数据库提交的密码,进行加密处理。这一步应该JSP页面中实现,同时是密码的加密应该要是不可逆的
所用算法:mod5+salt
2.用户状态的标识信息,通常有生成token存入cookie实现功能实现
token的生成
首先搞明白这个token的作用就是一个令牌,用来标记一个用户的身份。那么首先他要唯一。其次他从客户端上传后,服务端能够验证这个token是由服务端生成的。
所以token生成只要满足以上目的,你随意就好了。当然别把敏感信息暴露出去了。
常用的一种生成方式:
- 该用户的uid,如:8888
- 该用户的口令,如: 123123
- 用户对应的salt,如:abcd
- 过期时间戳,如: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的实现
评论