前言
项目中,用户的登录密码怎么保存呢?明文?MD5加密?MD5加盐?其实这些做法都不是很好的选择!原因如下:
- 明文肯定是不可取的,一旦数据库被“脱裤”了,基本上用户信息就完蛋了
- 简单的MD5加密安全性上只比明文高一点,为什么呢?只要你有一个MD5加密集,对照数据库里的密文,很容易就能把密码破解出来!常用的手段就是:字典破解、彩虹表
- MD5加盐,其实就是在生成密码MD5值的时候,随机拼接一个字符串(盐值)。对比解密的时候,将这个盐值也参与计算,从而能将密码的安全性再提高一些。但还是解决不了字典破解的问题。
迭代慢hash
慢哈希,其实就是指执行这个哈希函数非常慢,这样暴力破解需要枚举遍历所有可能结果时,就需要花上非常非常长的时间,但是也只是针对攻击者而言,穷举密码的时候会很慢,有目的的对比其实是很快的。最好对不同用户的密码随机生成不同的salt,salt库和密码库分离开。
下面就给大家具体来实现一把,不能光说不练是吧!!!
首先肯定要修改上次的表结构了,毕竟上次都没有密码这个字段,好尴尬
修改后的表结构
CREATE TABLE `t_user` (
`userid` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '用户id主键',
`password` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '登录密码',
`name` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '姓名',
`gender` bit(1) NOT NULL COMMENT '性别:0男性 1女性',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`createDate` datetime DEFAULT NULL COMMENT '创建时间',
`role` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT '0' COMMENT '角色:0普通用户 1管理员',
PRIMARY KEY (`userid`),
UNIQUE KEY `userid_index` (`userid`) USING BTREE COMMENT '用户id索引,方便根据id查询'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
加盐迭代慢Hash工具类
这个我也是在网上找到的(不邀这个功了),不过还是很好用的
package com.zyu.boot.demo.utils.pwd;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.math.BigInteger;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
/**
* 迭代慢hash生成密码
*/
public class PasswordHash {
public static final String PBKDF2_ALGORITHM =