散列算法,Remal使用散列算法
生活随笔
收集整理的這篇文章主要介紹了
散列算法,Remal使用散列算法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、散列算法
散列算法讓其保證不可逆,安全。這里舉一個例子sh1的摘要算法。上代碼
/*** 散列算法* @author Administrator*/ public class HashRsaUtil {/*** 加密方式*/public static final String SHA1="SHA-1";/*** 加密次數(shù)*/public static final Integer ITERATIONS=512;/*** sh1摘要算法* @param input 傳入的參數(shù)* @param salt 干擾素(加鹽)* @return*/public static String sha1(String input, String salt){return new SimpleHash(SHA1,input,salt,ITERATIONS).toString();}/*** 隨機(jī)生成salt* @return 返回一個hex編碼的salt*/public static String generateSalt(){SecureRandomNumberGenerator generator = new SecureRandomNumberGenerator();return generator.nextBytes().toHex();}/*** 銘文加密返回密文格式* @param inscription 要加密的銘文* @return 返回salt和密文*/public static Map<String,String> encryptInscription( String inscription){Map<String,String> map = new HashMap<>(16);String salt = generateSalt();String ciphertext = sha1(inscription, salt);map.put("salt",salt);map.put("ciphertext",ciphertext);return map;}二、Remal使用散列算法
1.修改service模擬數(shù)據(jù)庫出來的數(shù)據(jù)
/*** 模擬數(shù)據(jù)庫出來的數(shù)據(jù)* 將123轉(zhuǎn)成密文* @param userName* @return*/@Overridepublic Map<String, String> findPasswordByName(String userName) {return HashRsaUtil.encryptInscription("123");}2.修改自定義的remal
package com.example.config;import com.example.service.impl.SecurityServiceImpl; import com.example.untils.HashRsaUtil; import org.apache.shiro.authc.*; import org.apache.shiro.authc.credential.HashedCredentialsMatcher; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.util.ByteSource; import org.springframework.util.StringUtils;import java.util.Map;/*** 自定義的realm* 繼承授權(quán)的接口** @author Administrator*/ public class DefinitionRealm extends AuthorizingRealm {/*** 鑒權(quán)** @param principalCollection* @return*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {return null;}/*** 指定完比較器之后還需要修改比較器,因為當(dāng)前使用的還是默認(rèn)的* 比較器,需要改成咱們自己的比較器*/public DefinitionRealm(){//指定密碼匹配方式has1//使用Hashed密碼比較器//指定算法HashedCredentialsMatcher matcher = new HashedCredentialsMatcher(HashRsaUtil.SHA1);//指定密碼迭代次數(shù)matcher.setHashIterations(HashRsaUtil.ITERATIONS);//使用父層方法使匹配方式生效,將我們指定的比較器寫進(jìn)去setCredentialsMatcher(matcher);}/*** 認(rèn)證** @param authenticationToken* @return* @throws AuthenticationException*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {//獲取登錄名String principal = (String) authenticationToken.getPrincipal();//然后模擬用登錄名去數(shù)據(jù)庫拿到密碼SecurityServiceImpl securityService = new SecurityServiceImpl();//獲取密文密碼Map<String, String> map = securityService.findPasswordByName(principal);//判斷拿到的密碼是否為空if (StringUtils.isEmpty(map)) {throw new UnknownAccountException("該用戶不存在!");}String salt = map.get("salt");String password = map.get("ciphertext");return new SimpleAuthenticationInfo(principal, password, ByteSource.Util.bytes(salt), getName());} }3.測試
@Testpublic void shiroLoginTest() {//導(dǎo)入ini配置創(chuàng)建工廠IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");//工廠構(gòu)建安全管理器SecurityManager securityManager = factory.getInstance();//使用工具生效安全管理器SecurityUtils.setSecurityManager(securityManager);//使用工具獲取subject的主體Subject subject = SecurityUtils.getSubject();//構(gòu)建賬號密碼UsernamePasswordToken passwordToken = new UsernamePasswordToken("zhangSan", "123");//使用subject主體去登錄subject.login(passwordToken);//打印登錄信息System.out.println("登錄結(jié)果" + subject.isAuthenticated());}結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的散列算法,Remal使用散列算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Shiro-概述
- 下一篇: 新老电脑必装的三款良心软件老电脑必备软件