Рейтинг:0

Необходимость PBKDF2 в текущей установке?

флаг ie

У меня есть один пароль, который представляет собой случайные байты, которые шифруют базу данных. Сейчас я использую схему шифрования https://gist.github.com/jbtule/4336842. Подводя итог, мы берем наш один пароль, генерируем соль для ключа аутентификации и ключа шифрования, запускаем PBKDF2 с 10 000 итераций для генерации ключей, затем используем AES для шифрования и HMAC для аутентификации. Затем соли сохраняются рядом с зашифрованным текстом.

Моя проблема в том, что генерация ключей становится чрезмерно медленной. Шифрование и дешифрование происходят наряду с другими процессами, требующими высокой нагрузки на ЦП, и для любой заданной процедуры выполняется множество запросов и, следовательно, множество дешифровок. Иногда этап генерации ключа может занимать ~5 секунд на элемент, который я хочу расшифровать.Но когда я читаю об этом, кажется, что функции вывода ключей не нужны для моего варианта использования, поскольку исходный пароль совершенно случайный.

Я думаю просто взять один пароль и объединить его с солями шифрования и аутентификации перед шифрованием/дешифрованием AES и HMAC. Я также мог бы просто уменьшить итерации PBKDF2 до чего-то низкого, например ~10, что может выглядеть небрежно, но потребует изменения меньшего количества кода и меньшего тестирования. Есть ли уязвимость безопасности, которую я здесь упускаю? Может ли какое-либо из этих решений открыть меня для атаки, грубой силы или иным образом? Из того, что я читаю о генерации ключей, кажется, что мне это не нужно, но самодельные решения всегда плохи, поэтому я очень осторожен в удалении любой имеющейся у нас защиты. Спасибо за вашу помощь.

Swashbuckler avatar
флаг mc
Пока пароль имеет длину не меньше ключа и является *действительно* случайным (сгенерированным криптографическим генератором случайных чисел), вам не нужно использовать PBKDF2. Если оба эти утверждения неверны, вы все равно можете использовать PBKDF2 и просто отбросить счетчик итераций, если это действительно вызывает проблемы с производительностью.
SAI Peregrinus avatar
флаг si
Обратите внимание, что настоящие случайные ключи могут содержать встроенные символы NULL (0x00), в то время как пароли представляют собой строки (обычно UTF-8) и, следовательно, не могут содержать встроенные символы NULL (и обычно не могут содержать другие непечатаемые символы) и, следовательно, имеют меньше энтропии, чем указывает их длина. PBKDF принимает пароль в виде строки и выводит последовательность байтов. Таким образом, даже если вы сгенерируете свой «пароль» с помощью CSPRNG, вы все равно захотите использовать KDF для преобразования его из «печатных» символов в ключ.
Swashbuckler avatar
флаг mc
@SAIPeregrinus Да, я видел некоторые проблемы с совместимостью, когда одна реализация могла обрабатывать нули, а другая - нет.
Рейтинг:1
флаг ng

Всякий раз, когда PBKDF2 используется в качестве KDF с ключом с большой энтропией, его параметр итерации может быть безопасно равен 1, что должно заметно решить проблему при небольшой работе. Это применимо, если ключ представляет собой пароль с энтропией не менее 128 бит (например, 22 символа, выбранные случайным образом из 64).

Если, с другой стороны, пароль достаточно прост, чтобы его можно было запомнить, или его удобно вводить с клавиатуры, или если он выбран пользователем, не имеющим достаточной мотивации или здравого смысла, чтобы использовать хороший пароль, тогда ему необходим какой-то способ растяжка ключей, например, PBKDF2. Однако PBKDF2 — чрезвычайно плохой метод растяжения клавиш. 10 000 итераций PBKDF2 почти прозрачны для злоумышленника, использующего ASIC, и преодолимое препятствие для того, кто использует GPU. Я бы посоветовал как можно быстрее перейти на что-то получше (с участием памяти): Argon2, scrypt, даже поменьше bcrypt, для той части, которая растягивает пароль. И даже если вы делаете это, вам нужен лучший вариант, чем делать это так часто, что это становится узким местом.

Наиболее общий метод — кэширование. Это совершенно нормально тщательно энтропия — растянуть пароль всего один раз до 128-битной псевдоэнтропии, написать это вместе с паролем (будь то в ОЗУ или где угодно, лишь бы условия доступа были не более мягкими, чем для самого пароля), затем использовать это вместо пароль без дальнейшего растяжения (только производные, которые может сделать PBKDF2).

Ответить или комментировать

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