Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用ApacheShiro将哈希pws存储到数据库中?_Java_Database_Dao_Shiro_Jdbcrealm - Fatal编程技术网

Java 如何使用ApacheShiro将哈希pws存储到数据库中?

Java 如何使用ApacheShiro将哈希pws存储到数据库中?,java,database,dao,shiro,jdbcrealm,Java,Database,Dao,Shiro,Jdbcrealm,我已经到处找了,但我想做的事却没有运气 我正在寻找散列和盐我的用户密码,并存储到数据库中。问题是,如何存储它们 我已经看过了,我已经找到了类似的答案,但它没有意义 import org.apache.shiro.crypto.hash.Sha256Hash; import org.apache.shiro.crypto.RandomNumberGenerator; import org.apache.shiro.crypto.SecureRandomNumberGenerator; ... /

我已经到处找了,但我想做的事却没有运气

我正在寻找散列和盐我的用户密码,并存储到数据库中。问题是,如何存储它们

我已经看过了,我已经找到了类似的答案,但它没有意义

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,
我们必须将最终用户提交的原始/明文密码值转换为 存储起来更安全的字符串格式。你可以打电话给 encryptPassword(对象)方法创建更安全的值。例如:

 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.
但什么是“用户帐户”

很多时候,文档非常模糊

但是我注意到有一个“SubjectDAO”类,但没有UserDAO类

所以,是的,我不知道下一步该做什么,所以如果有人能帮助我,我将不胜感激


非常感谢

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

您必须实现
User
UserDAO
以保存到您自己的持久性存储中

UserAccount
也是要注册用户帐户时使用的模型对象。比如Gmail注册

您必须知道,ApacheShiro只是一个安全层(身份验证、授权等)。持久性必须由您实现


强烈建议您查看Spring数据JPA和Spring安全性

对密码进行哈希运算时:

DefaultPasswordService passwordService = new DefaultPasswordService();
String encytptedPwd= passwordService.encryptPassword("your password");
上述api将生成包括salt在内的密码

使用JDBC本机api更新此密码

在实现JDBCRealm时

PasswordMatcher credentialsMatcher = new PasswordMatcher();
this.setCredentialsMatcher(credentialsMatcher);
上面将设置凭据匹配器并使用
SimpleAuthenticationInfo
验证您的登录


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

我对持久性不太熟悉,因此感谢您提供的信息。我想shiro realms会处理所有事情,而不仅仅是阅读。。。我听说春天需要很多学习,但我花了很多时间和Shiro在一起。我喜欢它,但是文档太少了。我想在某种意义上,我可以使用生成的密码并使用SQL查询将其添加到数据库中,或者我应该使用某种持久性API吗?这几天似乎更喜欢坚持,但我对这一点还不熟悉,所以我不知道。为什么你比西罗更喜欢春天?感谢您可以使用普通的JDBC查询来实现持久层,但是使用API可以减少时间。Spring生态系统很容易学习,并且可以很好地协同工作。类似于Shiro的Spring Security是最广泛使用的安全API。谢谢,所以我想我会使用常规查询,但也许学习JPA更好。关于持久层有什么建议吗?你可能是最早说这很容易的人之一,即使是看shiro vs spring,也会有很多人谈论这有多困难或“复杂”,但我自己没有看过。我听说到处都在用弹簧,所以我不怀疑它很大。Shiro看起来很简单,有很多东西可以提供,但它确实花了一些时间来安装(而且仍然需要时间)。谢谢你的帮助!谢谢你。因为我已经为我的web应用配置了ini文件,所以我想最好还是保留它。如何访问ini文件数据?另外,根据我发现的一些信息,它说这个#privateSalt需要在shiro.ini中进行base64编码,而不是在Java代码中#Salt是用安全生成器随机生成的##saltGenerator=org.apache.shiro.crypto.securerandomanumbergenerator#hashService.privateSalt=saltGenerator.nextBytes.toBase64那么我如何访问它呢让我们从ini中说字段“saltGenerator”?