问答详情
源自:3-6 Shiro加密

使用了 HashedCredentialsMatcher 后密码并没有加密?

不太清楚有没有碰到密码没有真正加密的问题...吾辈在 CustomRealm 中对传进来的密码进行了断点查看发现并没有加密(还是明文), 老师的课程中没有对比密码, 不知道会不会有没有问题呢? (」゜ロ゜)」

https://img4.mukewang.com/5ae277a7000165c407760315.jpg

查看传入的 token 的值

https://img4.mukewang.com/5ae277ea0001eba114650259.jpg

提问者:RXLiuli 2018-04-27 09:08

个回答

  • JackSparrow414
    2019-04-20 15:19:38

    同学你好,你配置的只是shiro验证的加密规则,在你保存的时候并没有去加密,所以数据库里的密码还是明文,你在保存的方法那里设置一下加密算法名字,加密次数,盐值即可。例子如下:

    public void insert(User user1) {
      //对用户密码进行加盐处理
      String salt = RandomStringUtils.randomAlphabetic(20);
      user.setPassword(new SimpleHash("MD5",user1.getPassword(),salt,20).toHex());
      user1.setPassword(new Sha256Hash(user1.getPassword(),salt,20).toHex());
      user1.setSalt(salt);
      this.save(user1);
    }


  • alwynxu
    2018-09-24 20:28:34

    你看的密码没有加密是正确的,

    HashedCredentialsMatcher中的
    public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
        Object tokenHashedCredentials = hashProvidedCredentials(token, info);
        Object accountCredentials = getCredentials(info);
        return equals(tokenHashedCredentials, accountCredentials);
    }
    方法会对传过来的明文密码按照HashedCredentialsMatcher对象的设置进行加密,然后与数据库里面的加密密码进行比对的


  • ReLuFl
    2018-08-18 18:43:05

    我也是。。。。。。。没有跟视频里一样,根本没散列。。

  • alpha8
    2018-04-28 13:40:58

    你的自定义realm的doGetAuthenticationInfo少了一行代码, 指定salt盐值。

    如下:

    SimpleAuthenticationInfo saf = new SimpleAuthenticationInfo(username, user.getPassword(), this.getName());
    saf.setCredentialsSalt(ByteSource.Util.bytes(SALT));
    return saf;