Рейтинг:7

Нужно ли дезинфицировать пользовательский ввод для scrypt или PBKDF в целом?

флаг tr

Я хотел бы разрешить пользователю вводить пароль в качестве входных данных для некоторых ПБКДФ, который я буду использовать для создания ключа для шифрования файлов (в настоящее время используется aes-256-ctr. Он может измениться, когда я узнаю больше).

Я рассматриваю возможность использования scrypt. Нужно ли мне выполнять какие-либо экранирование, очистку или другие проверки пользовательского ввода, который я передам в scrypt?

В более общем плане, требуют ли PBKDF какие-либо проверки безопасности при вводе данных пользователем?

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

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

Однако, если вы принимаете пароли, содержащие символы, отличные от ASCII, вы, вероятно, захотите выполнить некоторую нормализацию Unicode для строки (вероятно, NFC), поскольку часто существует несколько способов выражения одного и того же логического символа. Например, вы можете выразить "é" как одну кодовую точку (U+00E9) или как две кодовые точки (U+0065 U+0301), и нормализация перепишет их в одну и ту же строку. Опять же, здесь нет проблем с безопасностью, но поскольку пользователи будут думать об этих двух паролях как об одном и том же, когда они имеют разные последовательности байтов, выполнение нормализации позволяет вашей системе также думать о них как об одном и том же пароле.

phoenixdown avatar
флаг tr
о, очень круто, я не подумал о нормализации, спасибо! есть ли простой способ нормализации NFC Unicode в javascript (nodejs), который вы могли бы предпочесть? я тоже поищу в гугле, спасибо
Aman Grewal avatar
флаг gb
@phoenixdown javascript имеет встроенный способ нормализации https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize
флаг jp
@phoenixdown: обратите внимание, что существуют и другие виды «нормализации», которые могут иметь или не иметь смысла. Это больше вопрос удобства использования, чем безопасности. Например, я считаю, что Facebook сокращает пароли, чтобы предотвратить проблемы из-за застрявших клавиш Shift / непреднамеренной блокировки заглавных букв. Затем возникает вопрос о гомоглифах, то есть о разных символах, которые выглядят одинаково. Это может даже зависеть от шрифта, например. некоторые шрифты используют разные глифы для греческой буквы my и микрознака, некоторые используют один и тот же глиф. Таким образом, кто-то может подумать, что набрал my, но на самом деле набрал micro или наоборот.
bk2204 avatar
флаг fr
Сворачивание паролей к регистру значительно ухудшает безопасность и этого делать не стоит. Кроме того, невозможно правильно свернуть регистр текста Unicode нечувствительным к локали способом. У IETF есть другие виды нормализации Unicode, которые можно применить к паролям, если NFC не соответствует вашим потребностям, которые решают некоторые из этих проблем.
флаг in
Будьте осторожны с нормализацией. С одной стороны, пользователь может не знать, какую версию é он ввел. С другой стороны, они могут быть *очень* осведомлены и предполагают, что обработчик паролей не внесет изменений в их ввод. По крайней мере, задокументируйте, какая нормализация будет применяться.
phoenixdown avatar
флаг tr
@ bk2204 - какой RFC вы думаете о нормализации Unicode, применяемой к паролям? Это https://datatracker.ietf.org/doc/html/rfc8265?
bk2204 avatar
флаг fr
Да, это RFC.
Рейтинг:5
флаг gh

Это будет зависеть от конкретной реализации KDF, которую вы используете. Я не знаю о каких-либо известных проблемах со scrypt (хотя это не значит, что их нет), но определенно были вопросы с PHP-реализацией Bcrypt, где наличие нулевых байтов на входе может вызвать проблемы.

флаг ar
Я хотел бы обвинить в этом в основном PHP, но быстрый взгляд на Википедию [предполагает] (https://en.wikipedia.org/wiki/Bcrypt#Versioning_history), что обработка нулевых байтов в bcrypt действительно была плохо определена, и я не удивлюсь, если исходная эталонная реализация C также будет иметь ту же ошибку. (В любом случае, bcrypt на самом деле не KDF, а функция хеширования паролей, причем довольно старая и устаревшая. Вы не можете использовать ее для получения ключа — по крайней мере, нелегко — и учитывая, что есть лучшие альтернативы, вам действительно не следует использовать его для хэширования паролей в настоящее время.)
phoenixdown avatar
флаг tr
Спасибо @Gh0stFish, я заметил в сообщении в блоге, что автор говорит, что проблема не затрагивает `scrypt` и `PBKDFv2`.Что ты посоветуешь? Проверять ввод на наличие нулевых байтов и удалять их перед переходом к `scrypt`? @bk2204 bk2204 это то, что вы бы тоже порекомендовали?
Gh0stFish avatar
флаг gh
@phoenixdown Я не думаю, что вам обязательно нужно удалять нулевые байты, вам просто нужно убедиться, что конкретная * реализация *, которую вы используете, обрабатывает их правильно. Например, если вы сравниваете две строки, такие как `foo` и `foo\0bar` (с фиксированной солью), и получаете один и тот же результат, это говорит о том, что используемая вами библиотека неправильно обрабатывает нулевые байты - в этом случае вам нужно будет удалить их.
phoenixdown avatar
флаг tr
Спасибо, это отличная идея - я могу добавить тест, чтобы гарантировать, что `foo` и `foo\0bar` не дают одинаковый результат, и если они это сделают, произойдет сбой.

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

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