我一直在寻找那个我没想过的地方。
我希望对用户密码进行哈希处理并将其存储到数据库中。问题是,我该如何存储它们?
我看过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类...
所以是的,我对下一步做什么感到困惑,所以如果有人能帮助我,我会非常感激!
非常感谢!
答案 0 :(得分:1)
似乎文档正在引用User
和UserDAO
作为您自己的用户模型实体(表)和用户数据访问层实体(要保存,更新,删除和检索的类)。这些必然不一定是Apache Shiro的一部分(原因一些数据访问层可能在RDBMS中,一些在内存中,有些甚至可能在属性文件中,为什么不呢?)
您必须实施User
和UserDAO
以保存到您自己的持久性商店。
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文件。