Рейтинг:0

Насколько безопасен 256-битный ключ AES, сгенерированный из PBKDF2

флаг cn

Я использую шифрование CryptoJS AES 256:

CryptoJS.AES.encrypt(realData, generateKey(кодовая фраза), {iv: iv});

Секрет генерируется через:

функция generateKey (парольная фраза) {
  const salt = CryptoJS.lib.WordArray.random(128/8);
  const key256Bits = CryptoJS.PBKDF2 (парольная фраза, соль, {
    размер ключа: 256/32,
    итерации: случайное число,
  });

  вернуть key256Bits;
}

Я новичок в этом и мне интересно, насколько безопасны 256keybits выше?

Может ли кто-нибудь использовать грубую силу, чтобы узнать шестнадцатеричные строки кодировки base64 из 256 битов ключа, iv, не заботясь о кодовой фразе.

Затем преобразовать реальные 256 битов ключа, которые использовались для расшифровки реальных данных в шифровании AES? Или 256keybits могут быть перебором?

Спасибо!

Рейтинг:1
флаг ng

Значение для итерации: случайное число не должно быть случайным числом. Это количество итераций, которое определяет стоимость PBKDF2. Предполагается, что в приложении он должен быть установлен настолько высоким, насколько это допустимо, и защита, обеспечиваемая PBKDF2 от перебора пароля, возрастает примерно линейно с этим параметром. Далее я предполагаю высокую итерации (скажем, базовый уровень сто тысяч), и что соль как-то сохраняется. Я также предполагаю, что используется HMAC-SHA-1 (по умолчанию) или HMAC-SHA-256 (также распространено).

Насколько нам известно, основным недостатком описанного является то, что можно проверить парольную фразу, запустив generateKey, а затем протестировав соответствующий ключ, используя известную криптограмму AES. В том, что "не заботясь о парольной фразе"? Мне это непонятно.

Проблема в том, что злоумышленники могут запускать PBKDF2 на очень высокой скорости, используя GPU, FPGA или ASIC. Когда итерации высок (как и должно быть), PBKDF2 является узким местом сгенерировать ключ и поиск пароля. Таким образом, злоумышленники могут искать пароли на несколько порядков быстрее, чем обычные пользователи, использующие CryptoJS. С точки зрения усложнения поиска пароля, что является его основной целью в этом вопросе, PBKDF2, таким образом, является одним из наихудших возможных вариантов использования резервной мощности процессора для растяжка ключей когда дело доходит до сильных противников. Намного лучшие варианты Argon2, scrypt или даже bcrypt.

Вы решаете, случайно ли то, что NIST ранее рекомендовал PBKDF2, и по-прежнему не требует использования чего-то лучшего; как это раньше толкнуло Dual_EC_DRBG, с очевидным намерением позволить американской разведке взломать эту криптовалюту. Можно применить бритву Хэнлона, но я больше уважаю ученых NIST.

Kim Mỹ avatar
флаг cn
"не заботясь о парольной фразе"? Я имею в виду, что фаза доступа, переданная в generateKey(парольная фраза), может содержать специальные символы, чтобы сделать ее надежной для грубой силы. В то время как ключ, возвращаемый из generateKey (фраза-пароль), который я могу использовать для шифрования и дешифрования реальных данных в CryptoJS.AES.encrypt (realData, generateKey (фраза-пароль), {iv: iv}), представляет собой массив байтов. Поскольку байты для меня новы, поэтому я не знаю, сложно ли их взломать и вернуть к расшифровке в качестве ключа.
Kim Mỹ avatar
флаг cn
Кроме того, читаемая (Hex, Base64) строка generateKey (фраза-пароль) (которую в Crypto-JS я могу просто использовать key256Bits.toString()) не содержит никаких специальных символов, если они шестнадцатеричные или только '/, +' и странное окончание ' ==', если base64. И это легко для грубой силы, а затем преобразовать обратно в массив байтов (возвращенный ключ из generateKey (фраза-пароль)), а затем поместить в расшифровку реальных данных? Извините, это новое для меня, и поправьте меня, если я ошибаюсь. Спасибо!
Kim Mỹ avatar
флаг cn
в библиотеке Crypto-JS, при условии, что кодировка читаемая (Hex, Base64) строка generateKey (фраза-пароль), я могу просто использовать CryptoJS.enc.Hex.parse(), чтобы получить реальные 256 битов ключа и расшифровать реальные данные, даже не заботясь о фразе-пароле передается в generateKey (парольная фраза) для генерации ключа дешифрования?
fgrieu avatar
флаг ng
Подбор 256-битного ключа, выраженного в виде 43-символьной строки Base64, не проще, чем подбор 32-байтового необработанного эквивалента. А это принципиально невозможно. Важной деталью является правильное кодирование вывода PBKDF2 для создания ключа AES со всеми 256-битными битами. Я предположил, что это неправильно. Это проблема программирования, сильно зависящая от CryptoJS, поэтому довольно не по теме. Я не обсуждал это.
dave_thompson_085 avatar
флаг cn
(@KimMỹ+) crypto-js.PBKDF2 возвращает _WordArray_, который является типом объекта javascript, который _содержит_ байты (но не является, например, встроенным Unit8Array javascript); если вы преобразуете это в строку (например,по console.log), этот результат закодирован в base64, но если вы передаете его в качестве ключа экземпляру crypto-js.Cipher, который использует в нем байты, тогда как если вы передаете (встроенную) _string_ такому экземпляру, он применяет Определенный OpenSSL и довольно плохой PBKDF (EVP_BytesToKey с niter=1), а также по умолчанию использует формат, определенный OpenSSL, с `Salted__`+8 байтов, предшествующих зашифрованному тексту и закодированный в base64.

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

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