Zend_Auth setCredentialTreatment
Я использую Zend_Auth
с setCredentialTreatment
установить метод хеширования и соль. Я вижу, что все примеры делают что-то вроде этого, где salt
похоже вставляется как текст.
-> setCredentialTreatment ('SHA1 (CONCAT (соль))?
но моя соль хранится в базе данных. Я мог бы сначала найти его, а затем использовать в setCredentialTreatment
но есть ли способ, которым я мог бы определить его непосредственно как имя поля, так setCredentialTreatment
будет знать, чтобы получить его с этого поля? вроде как мы определяем имя поля для имени пользователя или пароля
->setCredentialColumn('password')
У меня есть еще одна проблема: я бы хотел использовать SHA512, а не SHA1. Возможно ли это или нет? Все примеры, которые я вижу, используя SHA1.
Я должен сказать, что я довольно новичок в Zend и портирую существующее приложение, поэтому, пожалуйста, ответьте на мои вопросы.
2 ответа
В приведенном вами примере используется соль, хранящаяся в базе данных. Это будет работать до тех пор, пока соль хранится в каждой строке в поле, называемом "соль". Если бы соль была не в БД, а в переменной PHP, код был бы что-то вроде:
->setCredentialTreatment("SHA1(CONCAT(?, '$salt'))")
Что касается использования SHA512, это может быть немного сложнее. Предполагая, что вы используете MySQL, SHA1() в этом случае является функцией MySQL, и, насколько я могу судить, MySQL не имеет функции для SHA512, как и PHP (edit: я был неправ по поводу последнего, см. Комментарии). Таким образом, вам придется реализовать собственную функцию PHP SHA512, сначала загрузить соль для пользователя из БД, хэшировать результат и ничего не делать с переменной в setCredentialTreatment.
Как показал другой ответ, вы можете написать для этого свой собственный Zend_Auth_Adapter. Аутентификационный адаптер - это класс, который обрабатывает аутентификацию, предположительно в тот момент, когда вы используете Zend_Auth_Adapter_DbTable. Вы можете найти дополнительную информацию об адаптерах аутентификации в руководстве: http://framework.zend.com/manual/en/zend.auth.introduction.html
Вот пример:
class My_Auth_Adapter extends Zend_Auth_Adapter_DbTable
{
public function authenticate()
{
// load salt for the given identity
$salt = $this->_zendDb->fetchOne("SELECT salt FROM {$this->_tableName} WHERE {$this->_identityColumn} = ?", $this->_identity);
if (!$salt) {
// return 'identity not found' error
return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND, $this->_identity);
}
// create the hash using the password and salt
$hash = ''; // SET THE PASSWORD HASH HERE USING $this->_credential and $salt
// replace credential with new hash
$this->_credential = $hash;
// Zend_Auth_Adapter_DbTable can do the rest now
return parent::authenticate();
}
}