前言
前面配置了怎么使用 shiro ,這次研究下怎么使用spring shiro的密碼加密,並且需要在新增、更新用戶的時候,實現生成鹽,加密后的密碼進行入庫操作。
正文
配置憑證匹配器
@Bean
public HashedCredentialsMatcher hashedCredentialsMatcher() {
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
hashedCredentialsMatcher.setHashAlgorithmName("SHA-256");//散列算法:MD2、MD5、SHA-1、SHA-256、SHA-384、SHA-512等。
hashedCredentialsMatcher.setHashIterations(1);//散列的次數,默認1次, 設置兩次相當於 md5(md5(""));
return hashedCredentialsMatcher;
}
/** * 注冊身份驗證 * @param hashedCredentialsMatcher 憑證匹配器 * @return */
@Bean
public OAuth2Realm oAuth2Realm(HashedCredentialsMatcher hashedCredentialsMatcher) {
OAuth2Realm oAuth2Realm = new OAuth2Realm();
oAuth2Realm.setCredentialsMatcher(hashedCredentialsMatcher);
return oAuth2Realm;
}
這樣就把憑證匹配器注冊到身份驗證的 Realm 中,在用戶進行登陸操作的時候,在 Realm 中的 doGetAuthenticationInfo
方法中使用這種方法進行用戶身份認證:
return new SimpleAuthenticationInfo(
user, // 存入憑證的信息,登陸成功后可以使用 SecurityUtils.getSubject().getPrincipal();在任何地方使用它
user.getPassword(),
ByteSource.Util.bytes(user.getSalt()), // 加鹽,
getName());
生成加密密碼
/** * 隨機生成 salt 需要指定 它的字符串的長度 * * @param len 字符串的長度 * @return salt */
public static String generateSalt(int len) {
//一個Byte占兩個字節
int byteLen = len >> 1;
SecureRandomNumberGenerator secureRandom = new SecureRandomNumberGenerator();
return secureRandom.nextBytes(byteLen).toHex();
}
/** * 獲取加密后的密碼,使用默認hash迭代的次數 1 次 * * @param hashAlgorithm hash算法名稱 MD2、MD5、SHA-1、SHA-256、SHA-384、SHA-512、etc。 * @param password 需要加密的密碼 * @param salt 鹽 * @return 加密后的密碼 */
public static String encryptPassword(String hashAlgorithm, String password, String salt) {
return encryptPassword(hashAlgorithm, password, salt, 1);
}
/** * 獲取加密后的密碼,需要指定 hash迭代的次數 * * @param hashAlgorithm hash算法名稱 MD2、MD5、SHA-1、SHA-256、SHA-384、SHA-512、etc。 * @param password 需要加密的密碼 * @param salt 鹽 * @param hashIterations hash迭代的次數 * @return 加密后的密碼 */
public static String encryptPassword(String hashAlgorithm, String password, String salt, int hashIterations) {
SimpleHash hash = new SimpleHash(hashAlgorithm, password, salt, hashIterations);
return hash.toString();
}
然后將生成出來的鹽,加密密碼插入到數據庫就完成了。
@Override
public void save(SysUserEntity sysUser) {
sysUser.setCreateDate(new Date());
// 密碼加密 方式很多,任選
/* String salt = RandomStringUtils.randomAlphanumeric(20); sysUser.setPassword(new Sha256Hash(sysUser.getPassword(), salt).toHex());*/
String salt = ShiroUtils.generateSalt(20);
sysUser.setPassword(ShiroUtils.encryptPassword("SHA-256", sysUser.getPassword(), salt));
sysUser.setSalt(salt);
sysUser.setUsername(sysUser.getEmail());
sysUser.setStatus(SysConstant.SysUserStatus.ACTIVE);
sysUser.setType(SysConstant.SysUserType.USER);
sysUserDao.save(sysUser);
}