這篇文章主要介紹“Spring Boot集成Shiro并使用SHA-256加密密碼的方法”,在日常操作中,相信很多人在Spring Boot集成Shiro并使用SHA-256加密密碼的方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Spring Boot集成Shiro并使用SHA-256加密密碼的方法”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
桐城ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
我們不能將用戶的密碼以明文存儲,否則如果自己的數(shù)據(jù)庫被入侵,用戶在其他網(wǎng)站的帳號也可能被盜。
注冊時生成密文
Shiro 提供了一個 SimpleHash 類可以很方便的對字符串進行加密,只需一行代碼就可以對密碼進行加密。
String hashPassword = new SimpleHash("SHA-256", password, username+"reg", 1024).toString();
它的第一個參數(shù)是加密的算法,第二個是要加密的內(nèi)容,第三個是鹽(這個參數(shù)隨便你定),第四個是期望的次數(shù)。
得到加密之后的密碼,就可以將整個 User 對象存儲到數(shù)據(jù)庫中,以后登錄的時候再通過 Realm 查詢。
/**
* 注入用于存儲 user 對象
*/
@Autowired
private UserService userService;
@GetMapping("reg")
public Object reg(@RequestParam(name = "username") String username,
@RequestParam(name = "password") String password) {
String hashPassword = new SimpleHash("SHA-256", password, username+"reg", 1024).toString();
User user = new User();
user.setUsername(username);
user.setPassword(hashPassword);
user.setSalt(username + "reg");
userService.addUser(user);
return "注冊成功";
}
Realm
上一篇文章說了如何實現(xiàn)登錄,但是當(dāng)時沒有對密碼進行加密。
加密之后的 Realm 又該怎么寫了呢?
Shiro 給人一種感覺:基本的東西我都準備好了,你要啥就自己加。
所以只需要在自定義 Realm 里重寫它的 setCredentialsMatcher 接口,在里面指定算法類型、期望的次數(shù)就行了。
@Override
public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) {
HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
matcher.setHashAlgorithmName("SHA-256");
matcher.setHashIterations(1024);
super.setCredentialsMatcher(matcher);
}
這里跟注冊時基本一致,不過好像沒有指定鹽?
加密使用了鹽,驗證的時候也少不了它,只不過它不是寫在這里的,畢竟每個用戶的鹽可能是不一致的(鹽根據(jù)你自己的想法去設(shè)置)。
可還記得 doGetAuthenticationInfo 方法返回了一個身份認證信息對象供 Shiro 驗證,使用鹽之后,在創(chuàng)建這個對象的時候把鹽傳進去就行了。
注意:因為現(xiàn)在需要的不僅僅是密碼,還需要鹽。所以模擬查詢數(shù)據(jù)庫的時候不能僅僅返回一個字符串了,而是應(yīng)該返回一個對象,然后從對象中取出密碼、鹽。
/**
* 注入用于存儲 user 對象
*/
@Autowired
private UserService userService;
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username = token.getPrincipal().toString();
User user = userService.getUserByUsername(username);
if (user != null) {
String password = user.getPassword();
AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
username,
password,
//傳入鹽
ByteSource.Util.bytes(user.getSalt()),
getName());
return authenticationInfo;
}
return null;
}
模擬存取 User 對象
一切為了簡單。
@Service
public class UserService {
private HashMap
public void addUser(User user) {
users.put(user.getUsername(), user);
}
public User getUserByUsername(String username) {
return users.get(username);
}
}
到此,關(guān)于“Spring Boot集成Shiro并使用SHA-256加密密碼的方法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
新聞名稱:SpringBoot集成Shiro并使用SHA-256加密密碼的方法
URL地址:http://weahome.cn/article/iijdgp.html