当前位置: 首页 > 知识库问答 >
问题:

如何使用四郎的SaltedAuthenticationInfo?

陆阳曜
2023-03-14

我为我的应用程序开发一个身份验证组件。我正在使用带有盐密码的Apache Shiro API。

ByteSource salt = randomNumberGenerator.nextBytes(32);      
byte[] byteTabSalt = salt.getBytes();   
String strSalt = byteArrayToHexString(byteTabSalt);         
String hashedPasswordBase64 = new Sha256Hash(inPassword, salt, 512).toBase64();

谢谢你的帮助。

共有1个答案

漆雕令秋
2023-03-14

saltedauthenticationinfo是一个接口。为了方便起见,Shiro API提供了许多默认实现。尽可能地尝试使用默认实现之一;避免创建您自己的。
我建议使用SimpleAuthenticationInfo,它实现的不仅仅是SaltedAuthenticationInfo,但可能足以满足您的需要。
有关详细信息,请参阅org.apache.shiro.authc.SimpleAuthenticationInfo。

如果您绝对需要实现自己的saltedauthenticationInfo,则应仔细遵循文档。
有关详细信息,请参阅org.apache.shiro.authc.authenticationInfo和org.apache.shiro.authc.saltedauthenticationInfo。

布尔doCredentialsMatch(AuthenticationToken,AuthenticationInfo)实际上负责身份验证逻辑
此方法采用AuthenticationToken形式的用户提交的凭据,并将它们与以前存储的AuthenticationInfo形式的凭据进行比较。
您必须确保先将所有必要信息传递给HashCredentialMatcher(迭代、算法和SaltedAuthenticationInfo中的salt)。

伪示例使用,

final int iterations = 50000;

AuthenticationToken authToken = ...;
SaltedAuthenticationInfo saltedAuthInfo = ...;

HashedCredentialsMatcher authenticator = 
     new HashedCredentialsMatcher(Sha256Hash.ALGORITHM_NAME);
authenticator.setHashIterations(iterations);

final boolean successfulAuthentication = 
     authenticator.doCredentialsMatch(authToken, saltedAuthInfo);

有关更多信息,请参见org.apache.shiro.authc.credential.HashedCredentialsMatcher。

>

  • 盐长度
    256位盐看起来不错。有了这么大的salt,您可以最大限度地减少任何两个用户共享同一salt的风险。请记住,在挑选盐长度,生日悖论发挥作用。

    迭代次数
    作为经验法则,您使用的次数绝不应少于10,000次。您当前使用的是512,

    String hashedPasswordBase64 = new Sha256Hash(inPassword, salt, 512).toBase64();
    

    大多数散列算法都是极快的(包括sha256),你不想做任何潜在的黑客任何恩惠。使用的迭代次数越多,验证的速度就会越慢,但它也会直接降低破解尝试的速度。

    如果需要,您可以让每个人更改他们的密码;迫使用户选择新的(希望更强的)首选算法设置。
    Unix操作系统多年来一直使用/etc/shadow来实现这一点。

    这需要更多的努力,但这是值得的投资。强大的身份验证控制至关重要。

  •  类似资料:
    • 我正在使用jersey构建一个web服务应用程序。使用apache shiro进行授权/身份验证im。 我找到了一些演示如何在web应用程序中使用apache shiro的教程。它们使用显示登录方法。具有用户名和密码字段的jsp页面,并且超过此字段。jsp页面是在shiro中配置的。我喜欢这样: 我想知道如何在没有任何密码的情况下进行身份验证。jsp页面,因为我的项目只有web服务。因此,我想我需

    • 我正在使用Java 8与JPA2/Hibernate5和MySQL。 这是连接表定义 以下是用户表的定义: 最后,这里是组织表的定义 我将Spring 5数据存储库用于OrgMemberRepository 正在突破的是单元测试: 我相信这应该是一个简单的任务,我相信有一个简单的修复。我会再多考虑一下,确保我在寻找正确的东西。 谢谢

    • 考虑下面的四个百分比,表示为数字: 我需要将这些百分比表示为整数。如果我简单地使用,我最终得到了101%的结果。 在平局(3.33,3.33,3.33)的情况下,可以做出任意的决定(例如3,4,3)。

    • 问题内容: 我需要读取一个JSON配置文件,修改一个值,然后将修改后的JSON重新保存回该文件。JSON非常简单: 要加载数据并修改值,请执行以下操作: 到目前为止,一切都很好; 现在,将JSON写回到文件中。首先,我尝试了这个: 可以正确写入文件,但缩进只有两个空格。 从文档看来,在使用此方法时似乎无法传递任何其他选项,因此我尝试修改此示例,这将允许我直接设置和的属性来指定缩进量: 但这似乎没有

    • 我在这里找到了这个方法: 我想要类似的功能,比如: 有人能帮我更换什么吗?以…为特点。