凭证匹配器-普通加密

  • (1)加密
    将明文加密成密文保存,账号保存在数据库中是需要加密码的
  • (2)加密算法
    ​​​http://www.ttmd5.com/list.php​
  • (3)实现
    》1 对数据库密码进行md5加密
    使用mysql的md5函数对密码进行加密,然后直接修改数据库的用户密码
    》2 在applicationContext-shiro.xml,添加加密认证配置
public class MD5Utils {
//
public static String stringToMD5(String plainText) {//参1 明文
byte[] secretBytes = null;
try {
secretBytes = MessageDigest.getInstance("md5").digest(
plainText.getBytes());//对明文的字节进行摘要
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("没有这个md5算法!");
}
//16或者32
String md5code = new BigInteger(1, secretBytes).toString(16);

//补0 一个字节转两位的16进制
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
}
}

@Test
publi
c void stringToMD5() {
String result = MD5Utils.stringToMD5("123");
System.out.println(result);
//md5(123)= 202cb962ac59075b964b07152d234b70
//202cb962ac59075b964b07152d234b70
}

//shiro也集成常用的加密的算法md5,sha-1

@Test
public void test02() {
Md5Hash md5Hash = new Md5Hash("123");//参1 传入明文
System.out.println(md5Hash.toString());
//202cb962ac59075b964b07152d234b70
}

Shiro-普通加密

​update pe_user set password=md5('123') where email= 'lw@export.com';​

<!--配置一个密码的匹配器-->
<!-- 123 是用户提交过来的, 密码的匹配器 得到密文1,与数据库的密码2-->
<!--创建凭证匹配器-->
<bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<!--指定加密算法-->
<property name="hashAlgorithmName" value="md5"/>
</bean>

<!--2.2.创建Realm-->
<bean id="authRealm" class="com.wzx.web.shiro.AuthRealm">
<property name="credentialsMatcher" ref="credentialsMatcher"/>
</bean>

凭证匹配器-加盐加密

  • (1)为什么要加盐
    如果只是单纯使用md5或sha1进行加密,容易被人利用"彩虹表"撞库来破解密码,导致密码不安全!这时可以进行加盐加密来解决。
    演示: 加盐
  • (2)shiro加盐加密
    1)编写代码对密码加盐加密
    2)编写自定义凭证匹配器
    3)在applicationContext-shiro.xml,添加自定义凭证匹配器
<!--使用自己定义的匹配器-->
<bean id="credentialsMatcher2" class="com.wzx.web.utils.CustomCredentialsMatcher">
</bean>
<!--2.2.创建Realm-->
<bean id="authRealm" class="com.wzx.web.shiro.AuthRealm">
<property name="credentialsMatcher" ref="credentialsMatcher2"/>
</bean>

修复添加用户时对密码加盐加密

  • (1)添加用户时候,需要对用户输入的密码加密、加盐,这样就可以使用添加的用户登陆了。
    //对密码加盐加密
if(user.getPassword()!=null) {
user.setPassword(new Md5Hash(user.getPassword(),user.getEmail()).toString());
}

UserServiceImpl

@Override
public void saveUser(User user) {
String uuid= UUID.randomUUID().toString();
user.setUserId(uuid);
//原来保存用户使用的密码是明文,现在需要对它进行加密
if(user.getPassword()!=null){
Md5Hash md5Hash = new Md5Hash(user.getPassword(),user.getEmail());//参1 明文 参2 盐
user.setPassword(md5Hash.toString());
}
l.info("saveUser "+user);
iUserDao.save(user);
}