shiro的MD5盐值加密的使用

如何将一个字符串加密为MD5,如果两个用户的密码相同则会有相同的加密结果,为了使两个密码相同的时候所产生的密码还不一样进一步提高安全性,所以考虑添加盐值。
首先添加依赖

 <!-- Shiro使用Spring框架 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.2</version>
        </dependency>

在ShiroConfig中配置加密方式


    /**
     * 配置加密方式
     * @return
     */
    @Bean
    public HashedCredentialsMatcher credentialsMatcher(){

        HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
        //设置属性值
        //设置加密算法
        matcher.setHashAlgorithmName("MD5");
        //设置加密次数
        matcher.setHashIterations(1024);
        //是否存储为16进制
        matcher.setStoredCredentialsHexEncoded(true);

        return matcher;
    }

当注册的时候,对注册的密码进行MD5盐值加密使用的是SimpleHash

new SimpleHash("MD5",user.getPassword(), user.getUsername(),1024).toHex();

第一项是加密方式,默认是MD5加密,第二项是需要加密的密码,第三项是盐值,一般使用用户名,第四项是加密次数,这里的次数必须和ShiroConfig中的加密方式的加密次数相同,否则密码会匹配不成功。在credentialsMatcher方法中将setStoredCredentialsHexEncoded设置为true,则需要使用toHex()进行转换成字符串,默认使用的是toBase64()
当登录的时候进行盐值解码的时候,使用ByteSource.Util.bytes()方法进行解码

// 获取盐值,即用户名
            ByteSource salt = ByteSource.Util.bytes(login.getUsername());
            //SimpleAuthenticationInfo 第一个参数是返回的数据,
            // 第二个值是密码,这个密码必须是用户名验证成功后从数据库中取出的加密后的密码,
            // 第三个字段是盐值,第四个字段是realm,即当前realm的名称,一般使用getName()即可
            //通过CredentialsMatcher属性进行密码的比对
            return new SimpleAuthenticationInfo(login, login.getPassword(), salt, getName());

你可能感兴趣的:(shiro的MD5盐值加密的使用)