关于数据库账号和密码加密的问题
采用md5进行加密
md加密是不可逆。但是现在md5可以被破解,怎么办?加盐处理
package com.mon.utils.pwd;import java.math.BigInteger;import java.security.MessageDigest;public class MD5Util {public MD5Util() {}public static String md5(String str) {try {MessageDigest md5 = MessageDigest.getInstance("MD5");md5.update(str.getBytes("UTF-8"));return bytesToHex(md5.digest());} catch (Exception var2) {throw new RuntimeException(var2);}}public static String md5slat(String str) {return MD5Util.md5(MD5Util.md5("kuangstudy" + str + "02170318!!!"));}public static String bytesToHex(byte[] bytes) {BigInteger bigInt = new BigInteger(1, bytes);String hashtext;for (hashtext = bigInt.toString(16); hashtext.length() < 32; hashtext = "0" + hashtext) {}return hashtext;}public static void main(String[] args) {System.out.println(md5slat("123456"));}}
生成一个加密的密码存于数据库,先进行测试:比如:123466 得到的密码:6f69bc15a78e679021ceef633f5d5d55
正规的加密流程 - 注册过程
开发注册功能,让用户填写账号和密码
发起异步请求,把用户填写的账号和密码,传递给服务端
服务端对密码password = Md5Util.md5slat(password) 存入数据库
登录过程:
js—加密 —java解密
用户输入账号和密码(js—enpwd(123456) – 1sdkn23hsdb)—劫持()
对输入过来的账号和密码。然后对密码进行password = Md5Util.md5slat((depwd(1sdkn23hsdb)))
然后把用户输入的密码加密以后和数据库的密码进行对比,如果相同,就登录成功,如果不同就登录失败。
登录代码比较
package com.pug.zixun.controller.login;import com.pug.zixun.bo.UserBo;import com.mon.enums.AdminUserResultEnum;import com.mon.ex.PugValidatorException;import com.mon.utils.pwd.MD5Util;import com.pug.zixun.config.BaseController;import com.pug.zixun.config.jwt.JwtService;import com.pug.zixun.config.validator.PugAssert;import com.pug.zixun.domain.User;import com.pug.zixun.service.user.IUserService;import com.pug.zixun.vo.UserVo;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController;/*** @author 飞哥* @Title: 学相伴出品* @Description: 飞哥B站地址:/490711252* 记得关注和三连哦!* @Description: 我们有一个学习网站:* @date /5/13$ 21:30$*/@RestController@Slf4jpublic class PassportLoginController extends BaseController {@Autowiredprivate IUserService userService;@Autowiredprivate JwtService jwtService;/*** 登录** @param userVo* @return*/@PostMapping("/login/toLogin")public UserBo logined(@RequestBody UserVo userVo) {// 这里有校验,spring-validator框架来完成 或者用断言 或者用自己封装的PugAssert.isEmptyEx(userVo.getUsername(), AdminUserResultEnum.USER_NAME_NOT_EMPTY);PugAssert.isEmptyEx(userVo.getPassword(), AdminUserResultEnum.USER_PWD_NOT_EMPTY);// 根据用户名称查询用户信息User dbLoginUser = userService.login(userVo);PugAssert.isNullEx(dbLoginUser, AdminUserResultEnum.USER_NULL_ERROR);// 用户输入的密码String inputPwd = MD5Util.md5slat(userVo.getPassword());// 如果输入密码和数据库密码不一致boolean isLogin = dbLoginUser.getPassword().equalsIgnoreCase(inputPwd);// 如果输入的账号和有误,isLogin=false.注意isFalseEx在里面取反的,所以会抛出异常PugAssert.isFalseEx(isLogin,AdminUserResultEnum.USER_INPUT_USERNAME_ERROR);UserBo userBo = new UserBo();// 根据用户生成tokenString token = jwtService.createToken(dbLoginUser.getId());userBo.setToken(token);// 注意把一些敏感信息全部清空返回dbLoginUser.setPassword(null);userBo.setUser(dbLoginUser);return userBo;}}