如何使用Apache Shiro将散列的pws存储到数据库中?

时间:2014-09-11 02:16:47

标签: java database dao shiro jdbcrealm

我一直在寻找那个我没想过的地方。

我希望对用户密码进行哈希处理并将其存储到数据库中。问题是,我该如何存储它们?

我看过http://shiro.apache.org/realm.html#Realm-authentication我找到了类似的答案,但它没有意义。

import org.apache.shiro.crypto.hash.Sha256Hash;
import org.apache.shiro.crypto.RandomNumberGenerator;
import org.apache.shiro.crypto.SecureRandomNumberGenerator;
...

//We'll use a Random Number Generator to generate salts.  This
//is much more secure than using a username as a salt or not
//having a salt at all.  Shiro makes this easy.
//
//Note that a normal app would reference an attribute rather
//than create a new RNG every time:
RandomNumberGenerator rng = new SecureRandomNumberGenerator();
Object salt = rng.nextBytes();

//Now hash the plain-text password with the random salt and multiple
//iterations and then Base64-encode the value (requires less space than Hex):
String hashedPasswordBase64 = new Sha256Hash(plainTextPassword, salt, 1024).toBase64();

User user = new User(username, hashedPasswordBase64);
//save the salt with the new account.  The HashedCredentialsMatcher
//will need it later when handling login attempts:
user.setPasswordSalt(salt);
userDAO.create(user);

用户也" UserDAO"目前存在于我所看到的内容中,并且所有这些示例似乎都使用了较旧的Shiro示例。

当我查看" PasswordService" javadoc我读了

帐户创建或密码重置

Whenever you create a new user account or reset that account's password,

我们必须将最终用户提交的raw / plaintext密码值翻译成a  存储更安全的字符串格式。你这样做是通过调用 encryptPassword(Object)方法创建更安全的值。例如:

 String submittedPlaintextPassword = ...
 String encryptedValue = passwordService.encryptPassword(submittedPlaintextPassword);
 ...
 userAccount.setPassword(encryptedValue);
 userAccount.save(); //create or update to your data store

Be sure to save this encrypted password in your data store 
and never the original/raw submitted password.

但是" userAccount是什么?"

很多时候文档很模糊。

但是我注意到有一个" SubjectDAO"类,但没有UserDAO类...

所以是的,我对下一步做什么感到困惑,所以如果有人能帮助我,我会非常感激!

非常感谢!

2 个答案:

答案 0 :(得分:1)

似乎文档正在引用UserUserDAO作为您自己的用户模型实体(表)和用户数据访问层实体(要保存,更新,删除和检索的类)。这些必然不一定是Apache Shiro的一部分(原因一些数据访问层可能在RDBMS中,一些在内存中,有些甚至可能在属性文件中,为什么不呢?)

您必须实施UserUserDAO以保存到您自己的持久性商店。

UserAccount也是您想要注册用户帐户时使用的Model对象。与Gmail注册一样。

您必须知道Apache Shiro只是安全层(身份验证,授权等)的一层。必须由你实施持久性。

强烈建议您查看Spring Data JPA和Spring Security。

答案 1 :(得分:1)

当您对密码进行哈希处理时:

DefaultPasswordService passwordService = new DefaultPasswordService();
String encytptedPwd= passwordService.encryptPassword("your password");

以上api将生成密码,包括salt。

使用JDBC native api ...

更新此密码

当您实施JDBCRealm

PasswordMatcher credentialsMatcher = new PasswordMatcher();
this.setCredentialsMatcher(credentialsMatcher);
上面的

将设置凭据匹配器并使用SimpleAuthenticationInfo来验证您的登录信息。

PasswordMatcher也可以配置为使用ini文件。