8

ハッシュメソッドとソルトを設定するためにZend_Authwithを使用しています。setCredentialTreatment私はすべての例がこのようなことをしているのを見ます、そこではsaltテキストとして挿入されているようです。

-> setCredentialTreatment('SHA1(CONCAT(?, salt))'

しかし、私のソルトはデータベースに保存されています。最初に取得してから使用することもsetCredentialTreatmentできますが、フィールド名として直接定義できる方法はありsetCredentialTreatmentますか?そのフィールドから取得することを知っているでしょうか?ユーザー名またはパスワードのフィールド名を定義する方法のようなものです

->setCredentialColumn('password')

私が抱えている副次的な問題は、SHA1ではなくSHA512を使用したいということです。これは可能ですか、それとも利用できませんか?SHA1を使用して見たすべての例。

私はzendにかなり慣れておらず、既存のアプリケーションを移植していると言わなければならないので、答えを簡単に教えてください。

4

2 に答える 2

8

あなたが与えた例は、データベースに保存されているソルトを使用しています。'salt'というフィールドの各行にsaltが格納されている限り機能します。ソルトがDBとPHP変数になかった場合、コードは次のようになります。

->setCredentialTreatment("SHA1(CONCAT(?, '$salt'))")

SHA512の使用に関しては、これは少し注意が必要かもしれません。MySQLを使用していると仮定すると、この場合のSHA1()はMySQL関数であり、MySQLにはSHA512の関数がありません。また、PHPもありません(編集:後者については間違っていました。コメントを参照してください)。 )。したがって、独自のPHP SHA512関数を実装し、最初にDBからユーザーのソルトをロードし、結果をハッシュし、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();
    }
}
于 2010-09-16T12:04:44.243 に答える
2

あなたはあなた自身を書くことができますZend_Auth_Adapter

于 2010-09-16T11:02:06.300 に答える