2014-09-11 3 views
1

Я искал повсюду, не повезло, что я пытаюсь сделать.Как хранить хэшированные pws в db с Apache Shiro?

Я ищу хэш и солью своих паролей пользователей и храню их в БД. Проблема в том, как я их храню?

Я посмотрел на это 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, 

мы должны перевести конечного пользователя, представленный сырец/открытого текста значение пароля в формате строки, что гораздо безопаснее хранить. Вы делаете это, вызывая метод шифрования 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 ...

Так что да, я запутался, что делать дальше, так что если кто-нибудь может помочь мне, что я был бы признателен, значительно !

Большое спасибо!

ответ

1

Похоже, что в документации ссылаются User и UserDAO как ваша собственная модель пользователя (таблица) и пользовательский уровень доступа к данным пользователя (класс для сохранения, обновления, удаления и извлечения). Это необязательно не должно быть частью Apache Shiro (причина, по которой некоторый уровень доступа к данным может быть в СУБД, некоторые из них - в db-памяти, некоторые могут даже быть в файле свойств, почему бы и нет?)

Вы должны реализовать User и UserDAO, чтобы сохранить ваш собственный магазин настойчивости.

UserAccount также является объектом модели, который вы используете, когда хотите зарегистрировать учетные записи пользователей. Как и регистрация Gmail.

Вы должны знать, что Apache Shiro - это просто уровень безопасности (аутентификация, авторизация и т. Д.). Настойчивость должна быть реализована вами.

Настоятельно советуем вам проверить Spring Data JPA и Spring Security.

+0

Я не очень хорошо знаком с настойчивостью, поэтому спасибо за информацию. Я понял, что все сферы занимались всем, а не только чтением ... Я слышал, что Весна учится много, но я провел много времени с Сиро. Мне это нравится, но документации недостаточно. Я предполагаю, что в некотором смысле я могу взять сгенерированный пароль и использовать SQL-запрос для добавления его в БД или использовать какой-то API-интерфейс для сохранения? Кажется, что настойчивость в наши дни является чем-то предпочтительным, но я новичок в этом, поэтому не знаю. Почему вам нравится весна больше, чем сиро? thanks – XaolingBao

+0

Да, вы можете использовать простые JDBC-запросы для реализации уровня Persistence, но с использованием API сокращает время. Весенняя экологическая система легко учится хорошо работать вместе. Spring Security, подобная Shiro, является наиболее широко используемым API для безопасности. – shazin

+0

Спасибо, поэтому я думаю, что буду использовать регулярные запросы, но, возможно, лучше изучить JPA. Любые советы по слоям Persistence? Возможно, вы, наверное, один из первых, кто сказал, что это легко, даже глядя на сиро против весны, показывает, что многие люди говорят о том, как сложно или «сложно», но я сам не смотрел на него. Я слышал, что Весна используется повсюду, поэтому я не сомневаюсь, что она большая. Shiro показалось легким, и у него было много чего предложить, но определенно потребовалось некоторое время, чтобы настроить его (и все еще требуется время). Спасибо за помощь! – XaolingBao

1

Когда вы хеширование пароля:

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

Над апи сгенерирует пароль включая соль.

Обновите этот пароль, используя собственный JDBC api ...

Когда вы реализуете JDBCRealm

PasswordMatcher credentialsMatcher = new PasswordMatcher(); 
this.setCredentialsMatcher(credentialsMatcher); 

выше зададут удостоверение Искателя и использовать SimpleAuthenticationInfo подтвердить свой логин.

PasswordMatcher также может быть настроен для использования ini-файла.

+0

Спасибо за это. Поскольку у меня уже есть мой ini-файл, настроенный для моего веб-приложения, я решил, что было бы лучше сохранить это. Как мне получить доступ к моим данным ini-файла? Также в соответствии с чем-то я нашел это говорит, что это # privateSalt должен быть в кодировке Base64 в shiro.ini, но не в коде Java #Salt генерируется случайным образом с Secure генератора ## saltGenerator = org.apache. shiro.crypto.SecureRandomNumberGenerator ## hashService.privateSalt = saltGenerator.nextBytes.toBase6 Итак, с этим, как я могу получить доступ, скажем, поле «saltGenerator»? изнутри ini? – XaolingBao