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を返します。同じクラスで動作します。何が間違っているのか疑問に思っていますか?