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());
doCredentialsMatch
Sha256CredentialMatcherのは次のようになります:
Object tokenfromSubmition = hashProvidedCredentials(token.getCredentials(),((SaltedAuthenticationInfo)info).getCredentialsSalt(),0);
Object passwordFromStorage =this.getCredentials(info);
Boolean match = equals(tokenfromSubmition, passwordFromStorage);
return match;
完全なコードはここからパスティで入手できます。これで認証は失敗します。しかし、パスワードをソルトしないようにコードを変更すると(アカウントを作成するとき)、SaltedAuthenticationInfoではなくAuthenticationInfoを返します。同じクラスで動作します。何が間違っているのか疑問に思っていますか?