為什么要進(jìn)行密碼加密挠蛉?
在我們的日常生活中凭涂,許多人有著在不同網(wǎng)站上使用相同密碼的壞習(xí)慣(包括我也是qaq),假如應(yīng)用程序或服務(wù)器出現(xiàn)漏洞畜号,數(shù)據(jù)被竊取,用戶的明文密碼直接被暴露給黑客缠黍。顯然后果將不堪設(shè)想弄兜。使用密碼加密可以有效地增加黑客破解密碼的難度药蜻,提高安全性。
什么是md5加密和md5鹽值加密替饿?
- md5加密:
明文密碼 + md5算法 = 密文密碼 - md5鹽值加密
鹽值處理后的明文密碼 + md5算法 = 密文密碼
鹽值可以由開發(fā)者進(jìn)行自定義语泽,這樣密碼被破解的可能性就有了顯著的降低。
下面演示基于SpringBoot框架的shiro實(shí)現(xiàn)MD5鹽值加密
SpringBoot整合shiro-實(shí)現(xiàn)MD5鹽值加密
一视卢、數(shù)據(jù)庫中應(yīng)有一個(gè)字段用于儲(chǔ)存鹽值
二踱卵、數(shù)據(jù)表映射的實(shí)體類中應(yīng)有鹽值屬性
package com.pedro.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private int id;
private String username;
private String password;
private String perms;
private String salt;
}
User.java
三、ShiroConfig中設(shè)置加密方式
1据过、設(shè)置加密算法并用@Bean標(biāo)簽注入Spring容器
//密碼加密算法設(shè)置
@Bean
public HashedCredentialsMatcher hashedCredentialsMatcher(){
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
//設(shè)置加密方式
hashedCredentialsMatcher.setHashAlgorithmName("md5");
//設(shè)置散列的次數(shù)
hashedCredentialsMatcher.setHashIterations(2);
return hashedCredentialsMatcher;
}
2惋砂、realm中設(shè)置開啟加密
@Bean
public UserRealm userRealm(){
//注入realm
UserRealm userRealm = new UserRealm();
//注入密碼加密
userRealm.setCredentialsMatcher(hashedCredentialsMatcher());
return userRealm;
}
四、修改realm類中的認(rèn)證方法
那么注冊(cè)用戶時(shí)如何對(duì)用戶設(shè)置的密碼進(jìn)行加密呢绳锅?
一西饵、可以準(zhǔn)備一個(gè)用于加密的工具方法
public class PasswordGenerateUtil {
public static String getPassword(String username, String password, String salt, int hashTimes) {
//利用傳入的信息進(jìn)行加密,得到密文
Md5Hash md5Hash = new Md5Hash(password, username + salt, hashTimes);
//返回密文
return md5Hash.toString();
}
}
二鳞芙、注冊(cè)用戶時(shí)注意
- 向數(shù)據(jù)庫中存入用戶信息時(shí)調(diào)用工具方法眷柔,加密密碼再存入
- 存入用戶信息時(shí)候記得把鹽值也存進(jìn)去
String salt1 = Long.toString(System.currentTimeMillis());
注意事項(xiàng):
- 加密密碼時(shí)設(shè)置的鹽值處理方式必須和realm中存入info時(shí)的鹽值處理方式設(shè)置得一樣
- 加密時(shí)的散列次數(shù)必須和ShiroConfig中加密算法的bean中設(shè)置的一樣
2020-5-24