现在还有很多系统里在用Md5加密用户密码!
大约十年前,我开发的系统,密码都是使用MD5加密。
表单input密码框 输入后 使用user.password传到后端
后端拿到user.password后再次执行:
user.serPassword(HashKit.md5(user.getPassword()));
这样就把密码明文,使用MD5加密了!
安全性?
别开玩笑了,很容易破解的,虽然Md5不可逆!
但是我们有暴力!
中国数学家黄小云已经成功破解Md5!!
如何提升一下密码的安全性呢?
使用加盐Hash256即可:官方最佳实践代码
String salt = HashKit.generateSaltForSha256();
password = HashKit.sha256(salt + password);
因为老系统平台安全性升级,原始明文密码并不知晓 ,数据库里只存的MD5值。
所以,升级老系统加盐 只能新的密码也是拿到明文后Md5然后与盐值合并一起Hash256了!
下面给出的是老系统升级的方案代码,同样也适用于新系统,只不过不需要中间明文密码先Md5加密的过程了。
一、用户新增和注册时处理流程
String password = user.getPassword(); String pwdSalt = HashKit.generateSaltForSha256(); user.setPwdSalt(pwdSalt); user.setPassword(HashKit.sha256(pwdSalt + HashKit.md5(pwd)));
二、用户登录处理流程
/** * 通过用户名密码获取用户信息 * @param userName * @param password * @return */ public User getUser(String userName, String password) { if(notOk(userName) || notOk(password)){ return null; } //通过用户名去找用户 User user = findFirst(Kv.by("username", userName)); if(user == null || notOk(user.getPwdSalt())) {return null;} String userPassword = user.getPassword(); String hashPassword = HashKit.sha256(user.getPwdSalt() + HashKit.md5(password.trim())); if(hashPassword.equals(userPassword) == false) { return null; } return user; }
这样就稍微增强了一下密码破解难度了,而且盐值随机的。
如果再难一点,可以每次登录成功后,刷新生成新的pwdSalt,每次都不一样。
扫码关注JFinal学院
【jfinalxueyuan】
精彩推荐:
【分享】用HuTool快速将JFinal的model数据导出Excel里
【解决】基于JFinal-Undertow的项目,如何快速导出War包?
【分享】使用JFinal4.8中的Slf4J日志门面配置,具体实现用Log4j2
【分享】微信公众平台开发常用两个内网穿透工具介绍,帮助本地开发环境方便调试
【视频】基于JFinal-undertow的项目打包与部署(linux centos7)