В приведенном вами примере используется соль, хранящаяся в базе данных.Это будет работать до тех пор, пока соль хранится в каждом ряду в поле под названием «соль».Если бы соль была не в БД, а в переменной 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();
}
}