0

apache shiroプロジェクトで使用するのはこれが2回目ですが、最初saltingはパスワードです。今回はを使用しますapache shiro 1.2.0。jsp、spring、JPA(spring-data-jpa)を使用SHA256し、データベースに保存する前に暗号化に使用するWebアプリケーションでshiroを使用base64しています。HashedCredentialMatcherを実装する、がSaltedJPARealmあります。Sha256CredentialMatcherこれが私のやり方です

コントローラでユーザーを作成する

RandomNumberGenerator rng = new SecureRandomNumberGenerator();
ByteSource salt = rng.nextBytes(10);              
        String hashedPasswordBase64 = new Sha256Hash(signupForm.getPassword(),salt).toBase64();

userService.createUser(signupForm.getFullName(), signupForm.getEmail(), hashedPasswordBase64, salt.toBase64());

私のパスワードはそうだと思いますがpassword1234、生成されたソルトは/ZFfGOcSxYhy+g==私のデータベースにあるので、私はパスワードを持っています:whb+0AihIGJ4n8QwULj1tR6qSwCrA+1BUvnoe4q4Cy4=のソルトsalt field in the databaseは同じです。

春の私の構成では:

<!--....-->
 <bean id="saltedJPARealm" class="bla.bla.webapp.security.SaltedJPARealm">
    <constructor-arg  ref="credMatcher"/>
</bean>

    <bean id="credMatcher" class="bla.bla.webapp.security.Sha256CredentialMatcher">
        <property name="storedCredentialsHexEncoded" value="false" />
        <property name="hashAlgorithmName" value="SHA-256" />
        <!--<property name="hashIterations" value="1024" />-->
    </bean>
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager" depends-on="userRepository">
    <property name="realm" ref="saltedJPARealm" />
</bean>
<!--....-->

ログインユーザー

 Subject currentUser = SecurityUtils.getSubject();
 if (!currentUser.isAuthenticated()) {
            UsernamePasswordToken token = new UsernamePasswordToken(loginForm.getEmail(), loginForm.getPassword(), loginForm.isRememberMe());
  SecurityUtils.getSubject().login(token);
        }

データベースからユーザーを取得した後のSaltedJPARealm's doGetAuthenticationInfo(AuthenticationToken at)リターン:SaltedAuthenticationInfo

ByteSource salt = ByteSource.Util.bytes(user.getSalt());           
return new SimpleAuthenticationInfo(user, user.getPassword().toCharArray(),salt,this.getName());

doCredentialsMatchSha256CredentialMatcherのは次のようになります:

    Object tokenfromSubmition = hashProvidedCredentials(token.getCredentials(),((SaltedAuthenticationInfo)info).getCredentialsSalt(),0);
    Object passwordFromStorage =this.getCredentials(info);

    Boolean match = equals(tokenfromSubmition, passwordFromStorage);
    return match;

完全なコードはここからパスティで入手できます。これで認証は失敗します。しかし、パスワードをソルトしないようにコードを変更すると(アカウントを作成するとき)、SaltedAuthenticationInfoではなくAuthenticationInfoを返します。同じクラスで動作します。何が間違っているのか疑問に思っていますか?

4

1 に答える 1

1

これPasswordServiceはPOJO(ネストされたプロパティを持つ)であり、そのネストされたプロパティはSpringでも同様に構成できます。

<bean id="passwordService" class="org.apache.shiro.authc.credential.DefaultPasswordService">
  <property name="hashService.hashAlgorithmName" value="SHA-512"/>
  <property name="hashService.hashIterations" value="500000"/>
</bean>

<bean id="myRealm" class="...">
  <property name="credentialsMatcher">
    <bean class="org.apache.shiro.authc.credential.PasswordMatcher">
      <property name="passwordService" ref="passwordService"/>
    </bean>
  </property>
</bean>

これにより、myRealmインスタンスはログイン試行中の資格情報チェックにPasswordServiceを使用できます。

エンドユーザーがパスワードを設定するとき(つまり、アカウント登録中またはパスワードのリセット中)にPasswordServiceを使用してパスワードを暗号化するには、 PasswordServiceBeanを挿入してから使用します。

String encryptedPassword = passwordService.encryptPassword(signupForm.getPassword());

userService.createUser(signupForm.getFullName(), signupForm.getEmail(), encryptedPassword);

Springの構成とコードの使用法は、低レベルの乱数ジェネレーターやHashService +HashAPIよりもはるかに優れています。

HTH!

于 2012-10-17T18:21:57.730 に答える