后台仅仅使用md5 或者 sha256对密码加密后存储在一定程度上存在被撞库风险。这时候考虑使用随机生成salt进行密码加盐。
前后台注册基本逻辑:
前端传入md5过的密码pmd5-》后台接受,并随机生成salt -》后台使用sha256(salt+pmd5) 生成最终密码pwd 。
-》后台在数据库存储字段为 salt、pwd 。
代码实现:
创建如下工具类PasswordUtil即可:
package utils;
import com.google.common.base.Charsets;
import com.google.common.hash.Hashing;
import org.apache.commons.lang3.RandomStringUtils;
/**
* 加盐 sha256()
*/
public final class PasswordUtil {
/**
*
* @return 生成密码需要的盐
*/
public static String getSalt(){
return RandomStringUtils.randomAlphabetic(64);
}
/**
*
* @param salt
* @param pwdPlain
* @return sha256
*/
public static String sha256(String salt,String pwdPlain){
return Hashing.sha256().newHasher().putString(salt + pwdPlain, Charsets.UTF_8).hash().toString();
}
}
如果没有RandomStringUtils这个类的包,可以mvn加依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.0</version>
</dependency>
在逻辑层使用:
@Override
public UserInfo createUser(UserDto userDto) {
User user = new User();
BeanUtils.copyProperties(user,userDto);
String salt = PasswordUtil.getSalt(); //获取salt
String pwd256 = PasswordUtil.sha256(salt,userDto.getPwd()); // sha256处理
user.setPassword(pwd256);
user.setSalt(salt);
UserInfo userInfo = new UserInfo();
BeanUtils.copyProperties(userInfo,user);
userDao.insertUser(user); // 数据库存储
return userInfo;
}
以上相当于使用 sha256(salt+md5)进行加密。