散列算法,Remal使用散列算法
生活随笔
收集整理的這篇文章主要介紹了
散列算法,Remal使用散列算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、散列算法
散列算法讓其保證不可逆,安全。這里舉一個例子sh1的摘要算法。上代碼
/*** 散列算法* @author Administrator*/ public class HashRsaUtil {/*** 加密方式*/public static final String SHA1="SHA-1";/*** 加密次數*/public static final Integer ITERATIONS=512;/*** sh1摘要算法* @param input 傳入的參數* @param salt 干擾素(加鹽)* @return*/public static String sha1(String input, String salt){return new SimpleHash(SHA1,input,salt,ITERATIONS).toString();}/*** 隨機生成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模擬數據庫出來的數據
/*** 模擬數據庫出來的數據* 將123轉成密文* @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* 繼承授權的接口** @author Administrator*/ public class DefinitionRealm extends AuthorizingRealm {/*** 鑒權** @param principalCollection* @return*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {return null;}/*** 指定完比較器之后還需要修改比較器,因為當前使用的還是默認的* 比較器,需要改成咱們自己的比較器*/public DefinitionRealm(){//指定密碼匹配方式has1//使用Hashed密碼比較器//指定算法HashedCredentialsMatcher matcher = new HashedCredentialsMatcher(HashRsaUtil.SHA1);//指定密碼迭代次數matcher.setHashIterations(HashRsaUtil.ITERATIONS);//使用父層方法使匹配方式生效,將我們指定的比較器寫進去setCredentialsMatcher(matcher);}/*** 認證** @param authenticationToken* @return* @throws AuthenticationException*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {//獲取登錄名String principal = (String) authenticationToken.getPrincipal();//然后模擬用登錄名去數據庫拿到密碼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() {//導入ini配置創建工廠IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");//工廠構建安全管理器SecurityManager securityManager = factory.getInstance();//使用工具生效安全管理器SecurityUtils.setSecurityManager(securityManager);//使用工具獲取subject的主體Subject subject = SecurityUtils.getSubject();//構建賬號密碼UsernamePasswordToken passwordToken = new UsernamePasswordToken("zhangSan", "123");//使用subject主體去登錄subject.login(passwordToken);//打印登錄信息System.out.println("登錄結果" + subject.isAuthenticated());}結果:
總結
以上是生活随笔為你收集整理的散列算法,Remal使用散列算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Shiro-概述
- 下一篇: 道指mt4代码_剑指offer算法题05