Bcrypt не работает в PHP? Может легко включать любую вредоносную нагрузку - PullRequest
0 голосов
/ 20 февраля 2012

Соль: может быть что угодно.
Фактор работы: может быть любым.
Все следующие генерируют один и тот же хэш!

$pad = base64_decode('/gB=');
$data = array(
    'LegitimatePayload',
    'LaterSwitchedToMaliciousPayload',
    'Abracadabra',
    'hatIsGoingOn',
    'CanBeAlmostAnything',
);

foreach($data as $str){
    echo crypt($pad.$str, '$2a$04$AnySaltHere')."<br>\n";
}


Выход:

$2a$04$AnySaltHere$$$$$$$$$$.m/QKi19jyBmSuP2VMcVuFRw.weCNRBa
$2a$04$AnySaltHere$$$$$$$$$$.m/QKi19jyBmSuP2VMcVuFRw.weCNRBa
$2a$04$AnySaltHere$$$$$$$$$$.m/QKi19jyBmSuP2VMcVuFRw.weCNRBa
$2a$04$AnySaltHere$$$$$$$$$$.m/QKi19jyBmSuP2VMcVuFRw.weCNRBa
$2a$04$AnySaltHere$$$$$$$$$$.m/QKi19jyBmSuP2VMcVuFRw.weCNRBa
$2a$04$AnySaltHere$$$$$$$$$$.m/QKi19jyBmSuP2VMcVuFRw.weCNRBa

Edit:
Вот строка, которая имеет те же первые два байта, но имеет другой хеш:
base64_decode ( '/ gBQyoK71jVY / J7QuBNJuFdxyf2eTBCs42chkx6ZvpJYszpzg ===')
Если php остановился на первом байте NUL, то как вы это объясните?

Ответы [ 3 ]

10 голосов
/ 20 февраля 2012

Все ваши строки имеют префикс, который при запуске через base64_decode приводит к символу 0xfe и символу 0x00 с дополнительными - изменяющимися - символами после 0x00. Поскольку стандартная крипта останавливается на символе 0x00, все ваши вызовы крипт только шифруют символ 0xfe.

Вы можете проверить это, просто позвонив по номеру

echo crypt("\376", '$2a$04$AnySaltHere')."<br>\n";

, который даст тот же результат.

Я предполагаю, что вы использовали base64_decode по ошибке, имея в виду на самом деле позвонить base64_encode.

Редактировать: Как указывает Роман, строка

"/gBQyoK71jVY/J7QuBNJuFdxyf2eTBCs42chkx6ZvpJYszpzg==="

будет на самом деле - несмотря на тот же префикс - полностью зашифрован. Это связано с тем, что эта строка на самом деле является недопустимой base64 и base64_decode возвращает false. В результате строка crypt'ится с тем же хешем, что и пустая строка.

5 голосов
/ 20 февраля 2012

Вы не предоставляете никаких допустимых строк в кодировке base64, поэтому base64_decode, вероятно, просто вернет false для всех ваших тестовых случаев и, таким образом, все равно зашифрует их. В любом случае, почему вы используете base64_decode?

0 голосов
/ 20 февраля 2012

Вы, вероятно, хотите base64_encode, а не base64_decode.причина, по которой все возвращается одинаково, в том, что результат всегда ложен.

...