cookie安全性学习心得
知识剖析
cookie的安全性体现在cookie的传输和保存、cookie加密算法两个方面
下面是对以上两方面最基础的体现
1、cookie的属性设置
(1)httponly属性, IE6开始支持cookie的HttpOnly属性,cookie中的HttpOnly属性被设置为true时 HttpOnly会话cookie支持的浏览器,将仅用于发送HTTP(或HTTPS)请求时,从而限制从其他非HTTP的API(如JavaScript脚本、 Applet等)访问。 阻止客户端脚本访问Cookie
在Servlet3中,web.xml中设置
<session-config>
<cookie-config>
<http-only>true</http-only>
<secure>true</secure>
</cookie-config>
</session-config>
(2)secure属性
当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连接则不会传递该信息,所以不会被盗取到Cookie的具体内容。
secure属性是防止信息在传递的过程中被监听捕获后信息泄漏。
HttpOnly属性的目的是防止程序获取cookie后进行攻击。
2、给cookie添加加密算法
编写DES加密的工具类,
登录流程:
验证登录 >> 登陆成功 >> 对用户ID和登录时间进行加密放在token中 >> 创建cookie:把token放进去
登录状态验证:
拦截器拦截url >> cookie的非空验证 >> 遍历cookie >> 根据代码验证cookie中的value
根据代码验证cookie中的value
(1)通过与数据库中指定信息对比
(2)通过一定的方法验证cookie中的信息
cookie1:name=userName
cookie2:userId+userName+user登录时间戳
都通过DES加密,添加到cookie;
解密中cookie的value,取出userName进行比较,进行验证。
顺便返回userName,实现用户标识:
其他深入cookie安全性的知识:http、https的安全性;SSL协议;加密算法方面等
编码实战
按照上面的流程和验证方法,简单的例子
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(HttpServletRequest request, HttpServletResponse response, People people, DESUtil desUtil) throws UnsupportedEncodingException {
logger.info("login:参数" + request.getParameter("passward") + request.getParameter("name"));
//MD5加密加盐
people.setPassword(DigestUtils.md5Hex(people.getPassword()) + "abc");
//登录验证userService.login方法
boolean loginType = userService.login(people.getName(), people.getPassword());
logger.info("验证结果" + loginType);
//登录时间
people.setUpdateTime(System.currentTimeMillis());
//DES加密
String str1 = desUtil.encryptFromLong(people.getUpdateTime());
String str2 = desUtil.encryptFromLong(people.getId());
//token:登录时间、用户Id、用户姓名加密组成
String token = desUtil.encrypt(str1 + "|" + people.getName() + str2);
if (loginType) {
logger.info("登录成功");
//添加cookie
Cookie namecookie = new Cookie("name", people.getName());// 新建一个Cookie对象
Cookie tokencookie = new Cookie("token", token);
namecookie.setMaxAge(30 * 60);// 设置为30min,生命周期
tokencookie.setMaxAge(30 * 60);
namecookie.setPath("/");//设置Cookie的使用路径
tokencookie.setPath("/");
response.addCookie(namecookie);// 保存cookie到客户端
response.addCookie(tokencookie);
return "redirect:/people";
} else {
logger.info("登陆失败");
return "fail";
}
}
拦截器中进行验证
//遍历cookie如果找到登录状态则返回true执行原来controller的方法
for (Cookie cookie : cookies) {
if (cookie.getName().equals("name")) {
//在页面显示登录用户
name = cookie.getValue();
logger.info("登录用户name-------------" + name);
}
if (cookie.getName().equals("token")) {
logger.info("token验证" + cookie.getValue());
//token解密
token = cookie.getValue();
String str3 = desUtil.decrypt(token);
//取出用户name信息
String name2 = str3.split("\\|")[1];
logger.info(name2);
//根据token解密后,验证用户name是否一致
if (name.equals(name2)) {
request.getSession().setAttribute("name", name);
return true;
}
}