MD5(Message Digest Algorithm 5),是一种散列算法,是不可逆的,即经过md5加密以后没办法获得原文,没有解密算法。前端
在通常的项目中都会有登陆注册功能,最简单的,登陆注册过程彻底没有加密,存储在数据库的密码也是明文,安全性是不好的,万一数据泄露就很差了(表一)。因此,经过MD5将密码加密后保存在数据库中(表二),在登陆的过程当中后端将从前端获取到的密码加密,对照数据库中已经加密的密码。算法
可是通常加密算法固定,很容易破解,安全系数低,就我所知,有不少网站能够直接破解密文。为了提升安全性,能够采起加盐的方式。生成一组随机串,保存在数据库中,而后混杂在原来的密码中,再经过加密算法加密,存进数据库中(表三)。数据库
表一后端
表二安全
表三网站
至于MD5加密算法的底层原理,参考这篇博客:https://blog.csdn.net/sinat_27933301/article/details/79538169加密
Java有挺多关于MD5加密的方法,这里就用Spring中的 DigestUtils.md5DigestAsHex() 实现。spa
public class MD5Util { public String passwordEncryptor(String password){ return DigestUtils.md5DigestAsHex(password.getBytes()); } }
从前端获取用户输入的用户名,查找数据库中的 salt,并混在用户输入的密码中,这里我直接把 salt 加在后面.net
// 省略不少代码,包括查找数据库的代码 String username = request.getParameter("username"); String password = request.getParameter("password"); String salt = impUserService.findSalt(username); String mdPassword = md5Util.passwordEncryptor(password + salt); User user = impUserService.find(username, mdPassword);
用户登陆时的密码须要在前端用js加密后再提交吗?code
我我的想法,应该是不用的。可能以为前端明文传输给后端的话,过程当中若是能被人截取到,那不是挺危险的。可是既然能获取,那前端的加密算法也暴露了,因此感受像是作无用功。固然这只是我我的想法,有知道的或者有其余想法的大佬跟我说一下哈哈哈。