Шифрование пароля в качестве альтернативы перцу - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть вопрос, касающийся предложения по двум основным ответам на этот вопрос .

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

Это псевдокод того, что они говорят?

$key = 'random_key_stored_elsewhere';
$hash = bcrypt($password);
$encrypted = encrypt($hash, $key);
// store $encrypted to DB

Сейчасчтобы проверить попытку входа:

if (bcrypt($user_input) == decrypt($encrypted, $key))
{
    // proceed login...
}

Скажем, утечка хеша, теперь нам нужно изменить ключ и повторно зашифровать хэши:

$decrypted_data = decrypt($encrypted, $key)
$new_key = 'new_random_key_stored_elsewhere';
$encrypted = encrypt($decrypted_data, $new_key);
// store $encrypted to DB

Это так?Если да, то как вращение ключей в случае утечки хеша может сделать недействительными взломанные пароли, если такая же процедура используется для проверки попыток входа в систему?Например,

if (bcrypt($user_input) == decrypt($encrypted, $new_key))
{
    // proceed login...
}

Вращение клавиш было бы бесполезным, или я что-то упустил?

1 Ответ

0 голосов
/ 22 ноября 2018

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

Хотя есть и другие сценарии.Возможно, ваш исходный код просочился, кто-то случайно зарегистрировал ключ в системе контроля версий, или машина разработчика имеет бэкдор.Как только вы обнаружите такую ​​утечку, вы можете обменять ключ на сервере, прежде чем будет атакована база данных, содержащая хэши.С перцем вы должны были вместо этого сбросить все пароли и сообщить об этом пользователям.

Возможно, злоумышленник получил хэши паролей (SQL-инъекция, резервное копирование) и теперь пытается атаковать ваш сервер, чтобы получить ключ.Если вы обнаружите это вовремя, вы можете обменять ключ, и просочившиеся хеши бесполезны.Вы получаете время между утечкой паролей и утечкой ключа, чтобы среагировать.

Кстати, ваше описание почти правильное, чтобы подтвердить пароль, сначала необходимо расшифровать хеш, а затем проверить его с помощьюBCrypt (его невозможно сравнить).

if (bcrypt_verify($user_input, decrypt($encrypted, $key)))
...