shiro鹽值加密並驗證

在數據表中存的密碼不該該是123456,而應該是123456加密以後的字符串,並且還要求這個加密算法是不可逆的,即由加密後的字符串不能反推回來原來的密碼,若是能反推回來那這個加密是沒有意義的。著名的加密算法,好比 MD5,SHA1。下面就來介紹如何用shiro進行MD5加密並驗證前端

1.在註冊的時候將前端傳過來的密碼入數據庫以前進行加密java

public void encryptPassword(User user) {
        String salt = new SecureRandomNumberGenerator().nextBytes().toHex();
        user.setSalt(salt);

        String newPassword = new SimpleHash(
                algorithmName,
                user.getPassword(),
                user.getSalt(),
                hashIterations).toHex();

        user.setPassword(newPassword);
    }

  

2.在spring容器中自定義realm的配置加入HashedCredentialsMatcher,這樣前端輸入的密碼進入realm就會自動進行加密了,此外還能夠配置了加密次數等。算法

<bean id="myShiroRealm" class="com.wang.realm.MyShiroReaml">
        <!-- businessManager 用來實現用戶名密碼的查詢 -->
        <property name="userService" ref="userService" />
        <property name="permissionService" ref="permissionService" />
        <!-- 若是不加入密碼匹配的操做,密碼就不會存在 -->
        <!-- 加入了密碼匹配器以後,就會默認將前臺傳遞過來的密碼自動MD5加密 -->
        <property name="credentialsMatcher">
            <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
                <!-- 加密的方式 -->
                <constructor-arg index="0" type="java.lang.String" value="MD5" />
                <!-- 加密的次數,默認是1次 -->
                <property name="hashIterations" value="2"/>
            </bean>
        </property>
    </bean>

 3.這部分就是realm的驗證部分了接收前端的參數,取出數據庫中的對象,而後根據密碼,鹽值等進行解密,匹配等等,這部分shiro已經幫咱們作好了。spring

// 認證方法
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {

        //驗證帳號密碼
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        User user = userService.findUserByName(token.getUsername());
        if(user==null){
            throw new UnknownAccountException();
        }
        if(Boolean.TRUE.equals(user.getLocked())) {
            throw new LockedAccountException(); //賬號鎖定
        }


        ByteSource credentialsSalt = ByteSource.Util.bytes(user.getSalt());//這裏的參數要給個惟一的;

        //最後的比對須要交給安全管理器
        //三個參數進行初步的簡單認證信息對象的包裝
        SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
                user.getUsername(), //用戶名
                user.getPassword(), //密碼
                credentialsSalt,
                getName()  //realm name
        );

        return authenticationInfo;
    }
相關文章
相關標籤/搜索