数据库设计
1、数据库设计
CREATE TABLE `miaosha_user` (
`id` bigint(20) NOT NULL COMMENT '用户ID,手机号码',
`nickname` varchar(255) NOT NULL,
`password` varchar(32) DEFAULT NULL COMMENT 'MD5(MD5(pass明文+固定salt) + salt)',
`salt` varchar(10) DEFAULT NULL,
`head` varchar(128) DEFAULT NULL COMMENT '头像,云存储的ID',
`register_date` datetime DEFAULT NULL COMMENT '注册时间',
`last_login_date` datetime DEFAULT NULL COMMENT '上次登录时间',
`login_count` int(11) DEFAULT '0' COMMENT '登录次数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
2、使用加密算法(MD5)对密码分两次加密入库
(1)client端: PassWord = MD5(明文 + 固定Salt)
防止传输过程中,cookie被攻击者截取获得明文密码。
(2)server端: PassWord = MD5(用户输入 + 随机Salt)
若数据库被盗,攻击者可能会通过反查,获取到密码,所以需要二次加密。
private static final String salt = "q4w5e8r6d1a3";
public static String md5(String src){
return DigestUtils.md5Hex(src);
}
/**
* 第一层md5加密
* @param inputPass
* @return
*/
public static String inputPassToFormPass(String inputPass){
String str = "" + salt.charAt(0) + salt.charAt(2) + inputPass + salt.charAt(5) + salt.charAt(4);
return md5(str);
}
/**
* 二次加密
* @param formPass
* @param salt
* @return
*/
public static String formPassToDBPass(String formPass,String salt){
String str = "" + salt.charAt(0) + salt.charAt(2) + formPass + salt.charAt(5) + salt.charAt(4);
return md5(str);
}
public static String inputPassToDbPass(String input, String saltDb){
String formPass = inputPassToFormPass(input);
String dbPass = formPassToDBPass(formPass,saltDb);
return dbPass;
}