如何获取/设置 JdbcRealm 的盐

发布于 2025-01-05 19:08:00 字数 130 浏览 3 评论 0原文

我正在尝试使用 Shiro JdbcRealm 和 SHA256 hashedcredentialsMatcher。我需要更新旧数据库并为每个用户分配适当的盐(通过批处理例程)。

如何使用 Shiro 框架获取/设置给定帐户的盐?

I am attempting to use the Shiro JdbcRealm and SHA256 hashedcredentialsMatcher. I need to update a legacy database and assign the appropriate salt for each user (via a batch routine).

how do I get/set the salt for a given account using the Shiro framework?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蓝眼泪 2025-01-12 19:08:00

使用 Shiro 1.2.3,您需要做的就是:

  1. 扩展 JdbcRealm 并设置 salt 样式。

    公共类 JdbcSaltRealm 扩展 JdbcRealm {
        公共 JdbcSaltRealm() {
            setSaltStyle(SaltStyle.COLUMN);
        }
    }
    
  2. 更新shiro.ini以使用扩展领域并从数据库获取盐列

    credentialsMatcher = org.apache.shiro.authc.credential.HashedCredentialsMatcher
    凭证匹配器.hashAlgorithmName = SHA-256
    jdbcRealm = com.mypackage.JdbcSaltRealm
    jdbcRealm.authenticationQuery = 从用户 WHERE 用户名 = 中选择密码、盐
    jdbcRealm.credentialsMatcher = $credentialsMatcher
    
  3. Hash & salt 当前/新用户密码。应该对所有现有用户以及新用户注册执行此操作。

    private void saltHashPassword(字符串密码) {
    
        字符串盐 = new BigInteger(250, new SecureRandom()).toString(32);
    
        //TODO: 将盐值保存到用户表中的“盐”列
    
        Sha256Hash 哈希 = 新 Sha256Hash(密码, 
                              (new SimpleByteSource(salt)).getBytes());
        String saltedHashedPassword = hash.toHex();
    
        //TODO: 将 saltedHashedPassword 值保存到用户表中的“密码”列
    }
    

我希望我的回答是清晰易懂的。

With Shiro 1.2.3 all you need to do is:

  1. Extend JdbcRealm and set salt style.

    public class JdbcSaltRealm extends JdbcRealm {
        public JdbcSaltRealm() {
            setSaltStyle(SaltStyle.COLUMN);
        }
    }
    
  2. Update shiro.ini to use extended realm and to get salt column from DB

    credentialsMatcher = org.apache.shiro.authc.credential.HashedCredentialsMatcher
    credentialsMatcher.hashAlgorithmName = SHA-256
    jdbcRealm = com.mypackage.JdbcSaltRealm
    jdbcRealm.authenticationQuery = SELECT password, salt FROM user WHERE username = ?
    jdbcRealm.credentialsMatcher = $credentialsMatcher
    
  3. Hash & salt current / new user passwords. This should be done for all existing users as well as on new user registrations.

    private void saltHashPassword(String password) {
    
        String salt = new BigInteger(250, new SecureRandom()).toString(32);
    
        //TODO: save salt value to "salt" column in user table
    
        Sha256Hash hash = new Sha256Hash(password, 
                              (new SimpleByteSource(salt)).getBytes());
        String saltedHashedPassword = hash.toHex();
    
        //TODO: save saltedHashedPassword value to "password" column in user table
    }
    

I hope my answer is clear and understandable.

守不住的情 2025-01-12 19:08:00

也许有点晚了:

看看这个 教程
该博客的所有者 Meri 准确描述了如何创建自己的salted JDBC Realm

这也是 1.3.0 版本社区中公认的改进

希望这有帮助,玩得开心!

Maybe a bit late:

Have a look at this tutorial.
Meri, the guy who owns the blog, describes exactly how to create an own salted JDBC Realm.

This is also an acknowledged improvement in the community for version 1.3.0 .

Hope this helpes, have Fun!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文