2013-05-25 3 views
1

PHP crypt function, как говорят, возвращаемое значение:Понимание PHP склепа() возвращает значение

"Returns the hashed string or a string that is shorter than 13 characters and is 
guaranteed to differ from the salt on failure." 

Я не понимаю, что это значит ... Я понял, в основном, как эта функция работает, но я бы как знать, как интерпретировать возвращаемое значение, и попытаться понять, КОГДА это условие происходит. Это, безусловно, одно из самых неопределенных объяснений в руководстве по PHP, или, может быть, я просто ослеплю от него в течение долгого времени ...? :)

+0

Dunno, насколько это важно, но 'crypt' может, конечно, терпеть неудачу, когда вы это называете неправильным - то есть: когда' $ str' (или '$ salt', если предоставлено) не могут быть законно превращены в строку. Например, если вы передаете массив, ресурс или экземпляр класса, который не определяет функцию '__toString(). На моей машине, однако, это заставляет 'crypt' возвращать' null', а не строку. – cHao

+0

gotcha ... хорошо, хотя он может передать короткую строку как признак сбоя. Мне интересно узнать, почему они говорят, что она отличается от соли при неудаче ... –

ответ

2

Одна вещь crypt documentation упоминает:

(5.3.2) Исправлено поведение Blowfish на недействительных раундов, чтобы вернуться "неудача" строка ("* 0" или "* 1"), вместо того, возвращаясь к DES.

По-видимому crypt может возвращать различные [плохо указанные] короткие строки при отказе. Я подозреваю, что бит «или« должен учитывать »отличается от соли».

Таким образом, строка «короче 13 символов» (о том, кто знает, что) -> сбой. Единственный документированный случай касается недействительных параметров Blowfish, но его можно было бы расширить в будущем. (Хотя не в документации, bug #64449 указывает на то, что «отказ» должен быть возвращен для алгоритмов, когда соль является недействительным.)


Рациональный, что соль никогда не возвращается могут быть связаны с bug #55439:

Если crypt() выполняется с солями MD5, возвращаемое значение составляет только соль.

Последствием является $valid = crypt($pw, $crypt); ИСТИНА, для любых $ pw.

Таким образом, гарантируя, что соль сама по себе не возвращается, она позволяет избежать цикла обратной связи, в котором хранятся хэши - только соль из-за ошибки - всегда регистрируются как действительные для любого пароля. Ограничение на то, что соль не возвращается может смягчить вырожденные взаимодействия разных (исправленных и непроверенных?) Серверов.


Кроме того, кто-нибудь знает, как найти точечную документацию для определенных версий PHP? Было бы интересно увидеть, когда была добавлена ​​статья «отличная от соли».

+0

Ok .. поэтому короткая строка -> сбой .. но все остальное ... »и, как гарантируется, будет отличаться от соли при неудаче» ... нормально, поэтому, если это не удается, мы получим короткую строку, и она также будет отличаться от соли? Почему эта важная информация? Я не понимаю, почему я хотел бы знать это ...? –

+0

@ быстрые рефлексы Я обновил свой ответ только с помощью нескольких рациональных объяснений, которые я мог найти.То есть, я считаю, что это просто взломать исправление ошибки, и весь склеп-интерфейс разрушается в беспорядок для поддержки текущих обычаев. Кто все равно проверяет возвращаемое значение склепа? Почему он не генерирует исключение при критическом сбое? Я думаю, по крайней мере, если соль не будет возвращена, пользователи никогда не смогут войти в систему, и кому-то придется [быстро] решить проблему. – user2246674

+0

Спасибо, хорошее объяснение! В принципе, СЛЕДУЕТ проверять результат crypt() и подтвердить, что это 13 символов или больше, прежде чем вставлять сгенерированный пароль в db, тогда ... Удивление, когда это не удается, похоже, что это не сработало, когда ему дали соли, содержащие недопустимые символы ... интересно, есть ли какой-либо предел, когда дело касается символов в фактическом пароле? –

Смежные вопросы