Модульное тестирование с хешированными паролями - PullRequest
3 голосов
/ 01 апреля 2011

Прямо сейчас я использую Zend Framework и бездельничаю с этим и phpunit. Вот моя дилемма.

Когда я создаю пользователя, я хэширую пароль в таблице пользователей. Я добавляю две соли, статическую из приложения и одну, которая генерируется случайным образом. Я использую функцию базы данных SHA, а затем UNHEX, чтобы сохранить пароль в двоичном столбце. Чтобы сообщить базе данных, как хэшировать пароль, я использую Zend_Db_Expr примерно так:

protected function _createPasswordDbExpression( $password )
{

    $quoted = $this->getDbTable()->getAdapter()->quoteInto( 'UNHEX( SHA1( ? ) )', $password );
    $binaryPassword = new Zend_Db_Expr( $quoted );

    return $binaryPassword;
}

До сих пор я использовал наборы данных xml для определения ожидаемых результатов, но сейчас, с хешированными паролями, я не знаю, что делать.

Я вижу решение этой проблемы, но должен быть лучший способ.

Я мог бы предварительно хэшировать пароль или пароли и использовать его только во время тестирования и в моих XML-файлах.

Есть ли другое решение, которое могло бы быть лучше и более проверяемым?

Я не знаю точно, как этот двоичный столбец повлияет на вещи, когда phpunit пытается напрямую вставить «хешированный» пароль.

1 Ответ

6 голосов
/ 01 апреля 2011

Прежде всего, никогда не делайте этого. Любой, кто имеет доступ к истории запросов к базе данных, может видеть необработанные пароли (они будут храниться в двоичных журналах). Вместо этого хешируйте их в приложении, чтобы сырые пароли были уничтожены. Благодаря этому функциональность вашей базы данных становится хранилищем значений, а не тем, что требует модульного тестирования.

Как только вы сделаете это функцией PHP, она станет тривиальной для модульного тестирования (просто используйте любое из числа стандартных тестовых векторов , чтобы убедиться, что оно было правильно хешировано.

Однако я бы весьма предложил бы использовать соль и функцию деривации для безопасного хранения пароля. Вы можете понять, почему в этом ответе . А что касается точного алгоритма, я бы предложил реализовать PBKDF2 . У меня есть реализация PHP, которую вы можете перепроектировать, если вы хотите здесь (библиотека еще не готова к работе, но этот алгоритм есть).

Наконец, я бы предложил использовать один из алгоритмов SHA2 вместо SHA1 (либо SHA256, либо SHA512 должно хватить). Он более устойчив к столкновениям и, как правило, считается значительно более прочным ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...