Shiro加密

本文详细介绍了使用Shiro框架进行用户身份认证的过程,包括如何设置HashedCredentialsMatcher进行密码加密,以及如何通过加盐增强安全性。通过具体代码示例,展示了如何在Shiro中配置MD5加密算法和迭代次数,以及如何在自定义Realm中实现加盐验证。

一,HashedCredentialsMatcher

HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
//设置加密算法
matcher.setHashAlgorithmName("md5");
//设置加密次数
matcher.setHashIterations(1);
userRealm.setCredentialsMatcher(matcher);

此时,获取到的密码应该是经过加密的

传入的账号和密码,从后台获取到的应该是加密后的111,即:698d51a19d8a121ce581499d7b701668

UsernamePasswordToken token = new UsernamePasswordToken("lmc", "111");

加密

Md5Hash md5Hash = new Md5Hash("111");//698d51a19d8a121ce581499d7b701668

代码:

@Test
    public void testAuthentication() {
        UserRealm userRealm = new UserRealm();
        //构建SecurityManager环境
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        defaultSecurityManager.setRealm(userRealm);

        HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
        //设置加密算法
        matcher.setHashAlgorithmName("md5");
        //设置加密次数
        matcher.setHashIterations(1);
        userRealm.setCredentialsMatcher(matcher);

        //主体提交认证请求
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken("lmc", "111");
        //登录
        subject.login(token);

        System.out.println("isAuthenticated : " + subject.isAuthenticated());
        //获取登录名
        System.out.println(subject.getPrincipal());

    }

二,加盐

第一步:对加密的字段进行加盐

new Md5Hash(password, "hh")//在加密的密码上加盐hh

第二步:在自定义realm中添加:

authenticationInfo.setCredentialsSalt(ByteSource.Util.bytes("hh"));

结果:

/**
     * 认证
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        //1.得到令牌
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        //2.调用业务组件进行登录判断
        User user = new User();
        user.setUsername(token.getUsername());
//        user.setPassword(new String(token.getPassword()));
        System.out.println("lmc = " + token.getUsername() );
        UserService userService = new UserService();
        List<User> users = userService.find((String) authenticationToken.getPrincipal(), "111");
        //3.判断用户是否为空,如果不为空代表登录成功
        if (users != null) {
            user = users.get(0);
            /*
                参数1:主角(用户对象)
                参数2:密码
                参数3:realm的类名
             */
            SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), "userRealm");
            //加盐验证
            authenticationInfo.setCredentialsSalt(ByteSource.Util.bytes("hh"));
            return authenticationInfo;
        }
        return null;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值