简单记录一下和第三方对接的文件的上传下载验证设计
工作以来还是第一次做这种加密和验证类的程序设计,初版应该还有很多不足,简单总结一下,方便后续的回顾和迭代。
拿到这个需求后我能考虑到的点有以下几个
1、登录验证机制。
2、密码传输的加密措施
3、多线程安全和程序的可复用可扩展。
设计思路如下
用户发送请求——服务端返回公钥
用户对密码进行加密——登录验证请求——返回token
用户存储token并携带再请求头中——上传和下载。
其中应用到的主要技术有 :
1、RSA算法加密
2、MD5算法签名认证加密
3、JWT的token生成和验证机制
4、spring基础应用
RSA算法总结过了不再赘述,MD5加密技术也比较老也不赘述了
这里总结一下JWT的token实现机制
1、生成一个秘钥
2、生成token
/**
* 生成token,该方法只在用户登录成功后调用
*
* @param Map集合,可以存储用户id,token生成时间,token过期时间等自定义字段
* @return token字符串,若失败则返回null
*/
public static String createToken(Map
String tokenString = null;
// 创建一个 JWS object
JWSObject jwsObject = new JWSObject(header, new Payload(new JSONObject(payload)));
try {
// 将jwsObject 进行HMAC签名
jwsObject.sign(new MACSigner(SECRET));
tokenString = jwsObject.serialize();
} catch (JOSEException e) {
System.err.println("签名失败:" + e.getMessage());
e.printStackTrace();
}
return tokenString;
}
3、验证token
/**
* 校验token是否合法,返回Map集合,集合中主要包含 state状态码 data鉴权成功后从token中提取的数据
* 该方法在过滤器中调用,每次请求API时都校验
*
* @param token
* @return Map
*/
public static Map
Map
try {
JWSObject jwsObject = JWSObject.parse(token);
Payload payload = jwsObject.getPayload();
JWSVerifier verifier = new MACVerifier(SECRET);
if (jwsObject.verify(verifier)) {
JSONObject jsonOBj = payload.toJSONObject();
// token校验成功(此时没有校验是否过期)
resultMap.put("state", TokenState.VALID.toString());
// 若payload包含ext字段,则校验是否过期
if (jsonOBj.containsKey("ext")) {
long extTime = Long.valueOf(jsonOBj.get("ext").toString());
long curTime = new Date().getTime();
// 过期了
if (curTime > extTime) {
resultMap.clear();
resultMap.put("state", TokenState.EXPIRED.toString());
}
}
resultMap.put("data", jsonOBj);
} else {
// 校验失败
resultMap.put("state", TokenState.INVALID.toString());
}
} catch (Exception e) {
// e.printStackTrace();
// token格式不合法导致的异常
resultMap.clear();
resultMap.put("state", TokenState.INVALID.toString());
}
return resultMap;
}
这里进行一下思路的扩展
1、加密