版权声明:严禁用于任何商业用途的转发!
为什么我们要使用shiro的加密工具再次封装密码:
绝大多数网站中的用户密码使用MD5加密后保存到数据库中,如果采用弱密码,例如:123456、admin等,有太多的MD5穷举网站可以获取到密码的MD5值,这个时候我们有必要改进密码加密机制!
Shiro的SimpleHash并非唯一选择,只是比较方便。
SimpleHash原理:
public SimpleHash(String algorithmName, Object source, Object salt, int hashIterations)
algorithmName:加密形式(具体支持哪些算法,请自行百度)
source:简单理解就是传入的原始明文密码值
salt:盐值
hashIterations:加密次数
最终得到加密的密码 = MD5(明文密码 + 盐值)* 加密次数
1. 引入Shiro
<!--shiro-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.2</version>
</dependency>
package org.bluedream.core.utils;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.util.ByteSource;
import org.bluedream.core.module.sys.entity.User;
public class PasswordHelper {
// 加密形式
public static final String ALGORITHM_NAME = "MD5";
// 加密次数
public static final int HASH_ITERATIONS = 128;
private PasswordHelper(){
throw new AssertionError();
}
/**
* 返回MD5加密后的字符串
* @param sourcePWD 原始密码文本
* @param salt 盐值
* @return
*/
public static String encryptPassword(String sourcePWD , String salt){
return new SimpleHash(ALGORITHM_NAME , sourcePWD , ByteSource.Util.bytes(salt) , HASH_ITERATIONS).toHex();
}
/**
* User对象加密
* @param user
* @return
*/
public static String encryptPassword(User user){
return encryptPassword(user.getPassword() , user.getLoginCode());
}
/**
* test return new password
* @param args
*/
public static void main(String[] args) {
String pwd = "123456";
String salt = "system";
System.out.println(encryptPassword(pwd , salt));
}
}