Примечание: это было первоначально опубликовано martinheinz.dev
Есть много мифов и неправильных предположений о криптографии и безопасности в целом. Люди обычно злоупотребляют криптографическими примитивами, предполагают, что что -то безопасно по умолчанию или использовать устаревшие технологии/алгоритмы. Итак, давайте посмотрим на некоторые из этих мифов и общих ошибок, чтобы вы могли избежать их в будущем.
Прекратите использование/dev/random уже
В значительной степени кто -нибудь сказал бы, что вы всегда должны использовать /dev/random
Для криптографических целей. Ну, это неправильно. Оба /dev/urandom
и /dev/random
используют то же самое Csprng Анкет Разница между ними в том, что /dev/random
блоки до тех пор, пока у него не будет достаточно энтропии. Что является еще одной проблемой — вы не хотите, чтобы ваши приложения ждали энтропии и логики дизайна вокруг возможности /dev/random
Блокируя, особенно учитывая, что вам не нужна такая энтропия … Все, что вам нужно, это около 256 бит энтропии, которые вы получите от /dev/urandom
. Если вы хотите углубиться в эту тему, то см. Статью Здесь Анкет
Никогда не используйте AES ECB
Как вы наверняка знаете Aes это шифр блока. Он шифрует простой текст в блоках 128 бит. Хорошо, звучит хорошо, так в чем проблема с использованием ЕЦБ (электронная кодовая книга) Режим? Он использует неизменную ключ на каждом блоке, поэтому, если вы шифруете более 128 бит данных, ваш шифвый текст будет выглядеть примерно так:
Это не так много шифрования, верно? Итак, что вы должны использовать вместо ЕЦБ ? Счетчик режима (CTR)! Почему? Потому что шифрование можно сделать параллельно, и он использует Iv (Nonce), чтобы избавиться от неизменная ключевая проблема , это ECB режим имеет. Просто не забывайте повторно использовать Iv Анкет
Вот как будет выглядеть текст шифра с Ctr Режим:
Вы можете попробовать сами с openssl :
~ $ identify gopher.png gopher.png PNG 650x650 650x650+0+0 8-bit sRGB 38.9KB 0.000u 0:00.000 # Note the dimensions ~ $ convert -depth 32 gopher.png gopher.rgba ~ $ openssl enc -aes-128-ecb -e -in gopher.rgba -out gopher-ecb.rgba -k toomanysecrets # Replace ecb with other modes too (e.g. ctr) ~ $ convert -size 650x650 -depth 32 gopher-ecb.rgba gopher-ecb.png
Никогда не используйте MD5 ни за что, никогда
Пока мы находимся на теме никогда не использовать вещи … забудьте о MD5 , как, прямо сейчас. Он был разработан для использования в качестве безопасного криптографического алгоритма хэш -аш, но на данный момент в этом нет ничего надежного. Он имеет уязвимость столкновения, где вы можете создать пару файлов, которые имеют одинаковые MD5 Хэш, что означает, что вы можете подделать сертификаты SSL или CA. Итак, что вместо этого использовать? Это зависит от варианта использования — для хэсширования пароля. Использование Bcrypt
или Scrypt
Анкет Какой из тех, кого вы используете, на мой взгляд, личные предпочтения — Scrypt
был разработан, чтобы быть «Лучше» чем bcrypt
Но это новее, поэтому он столкнулся с меньшим контролем. Я — лично — все еще использую Bcrypt
. Что касается других вариантов использования, используйте хэш -функцию из SHA-2 Семья, предпочтительно более длинные диварийные, такие как SHA-512 Анкет
Всегда Encrypt-Then-Mac
Название этого раздела гласит «Encrypt-Then-mac» , но давайте сначала вернемся. Многие люди не понимают, что они всегда должны использовать шифрование в сочетании с аутентификацией сообщений. Я не хочу вдаваться в подробности о том, почему вы должны на самом деле аутентифицировать сообщения, все, что я скажу, это то, что если вы не аутентифицируете сообщения, то вы открываете свои приложения для довольно много возможных атак, такие как Воспроизведение атаки или Активная атака Анкет
С этим с дороги, почему Encrypt-Then-mac ? Проще говоря, это единственный способ получить Доступная безопасность , что не всегда необходимо, но это означает, что по сути невозможно испортить криптографически При использовании этой конструкции.
Если вам нужно больше подробных объяснений, то я рекомендую статью Здесь Колин Персиваль.
Специальные символы не делают ваши пароли хорошими
Не обязательно, по крайней мере. Хороший пароль — это тот, который вы можете запомнить, поэтому добавляя такие символы, как !@#$%^&*
Станет более вероятно, что вы или пользователи вашего приложения либо забудут его, либо запишите где -нибудь, где кто -то еще может его увидеть.
Какова причина добавлять специальные символы в пароль в первую очередь? Это энтропия , Так что, если мы не хотим заставлять пользователей включать в себя специальные символы в свои пароли, то какова альтернатива для поддержания энтропии достаточно высокой?
Сделать это looooong Анкет Как показано в популярном XKCD Password Sitch Comic , имеет смысл использовать пароль, изготовленный путем объединения нескольких случайных слов, чем попытка вспомнить какую -то тампу. Создание подобных паролей удовлетворяет как человеческий, так и компьютерный аспект, другими словами, легко запомнить и достаточно сложно угадать (высокая энтропия, без способа грубо его насильствовать).
Примечание. В идеальном мире каждый будет использовать диспетчер паролей и генерировать свои случайные пароли с энтропией, но это не то, что мы можем ожидать от среднего, неэх-опытного пользователя.
Вращение клавиши шифрования. Вращение в заблуждение
Кто -то, вероятно, уже сказал вам, что вы должны повернуть свои ключи в некоторое время, и это правильно, вы абсолютно должны это сделать. Многие люди, хотя, думают, что они должны сделать это, чтобы уменьшить вероятность сломанного ключа, что не относится к шифрование Ключи. Вы должны вращаться шифрование Ключи, чтобы уменьшить объем данных, зашифрованных ключом, чтобы снизить потенциальный ущерб, вызванный скомпрометированным единственным ключом. Это заблуждение не меняет того факта, что вы должны вращать клавиши, но важно знать, почему вы это делаете, чтобы вы могли правильно оценить, какие интервалы следует использовать.
Никогда не храните пароли пользователей
Вернуться к «Никогда не делай вещи» тема еще раз. Это немного разглагольствования, я видел так много раз, этот веб -сайт отправил мне пароль по электронной почте после того, как я зарегистрировался … например … первое, что вы должны сделать, когда вы получаете пароль от пользователя, — это хэш и бросить Вне четкой текстовой версии пароля, и если вы отправляете его мне по электронной почте, то вы явно не делаете этого ( Конец RANT )!
Итак, давайте сделаем глубокий вдох … как хранить эти пароли тогда?
Как только вы получите пароль от пользователя — хэш с медленной хэш -функцией, такой как bcrypt
Использование рабочего коэффициента не менее 12 и стирайте прозрачный текстовый пароль из памяти. Коэффициент работы 12 действителен Теперь , на момент публикации и не будет достаточно через год. Я бы лично Снимайте на сумму до 400 мс для проверки пароля, вы можете проверить свою машину, какой рабочий коэффициент даст вам это.
Если ты не собираешься использовать bcrypt
обязательно добавьте соль пароль, чтобы предотвратить предварительные атаки как Rainbow Table Attack Анкет
Контейнеры не безопасны
Многие думают, что Docker Контейнеры безопасны по умолчанию, но это не так. Они были построены для решения проблем развертывания, а не в безопасности.
Есть даже уязвимости, которые позволили бы злоумышленнику получить корень
Доступ к хост -системе, и все, что нужно, это оболочка доступ к контейнеру. Итак, как избежать этих проблем безопасности и уязвимостей?
- Используйте минимальные базовые изображения, чтобы уменьшить поверхность атаки — Пример этих изображений —
альпийский
-САЗАЛЬНЫЕ ИЗОБРАЖЕНИЯ ИЛИ РАСКАЯ ХАЧА Универсальные базовые изображения Анкет - Установите только необходимые библиотеки — Чем меньше у вас есть в контейнере, тем ниже шанс, что будет что -то, что можно использовать.
- Используйте доверенные изображения — Не загружайте любое изображение из Docker Hub Анкет Используйте те, которые рассматриваются, поддерживаются заслуживающими доверия командами и имеют много загрузок (много взглядов на них).
- Не используйте
Последний
теги — Используя фиксированные теги, вы убедитесь, что никакие уязвимости не будут введены с вашей следующей сборкой. - Используйте наименее привилегированного пользователя (никогда не запускайте под
root
) — Это хорошая практика, конец вашегоDockerfiles
сПользователь 1001
Команда, чтобы убедиться, что вы используете пользователя без привилегий, которые могли бы открыть ваш контейнер для дополнительных уязвимостей.
Есть гораздо больше вещей, которые вы могли бы сделать, чтобы обеспечить свои изображения, которые вы можете Google позже, но я думаю, что приведенный выше список — это минимум, что каждый должен иметь в виду при использовании Docker изображения/контейнеры.
Вывод
Каждый разработчик программного обеспечения/инженер Devops отвечает за безопасность приложений и системы, по крайней мере, в некоторой степени (нравится вам это или нет). Поэтому я считаю, что всем нам нужно немного времени, чтобы провести необходимое исследование, чтобы избежать глупых ошибок и заблуждений, таких как вышеупомянутые.
Не доверяйте тому, что люди говорят вам (люди все время делают ошибки). Когда дело доходит до безопасности и криптографии, посмотрите и проверьте это самостоятельно — принимайте решения на основе фактов.
Оригинал: «https://dev.to/martinheinz/security-and-cryptography-mistakes-you-are-probably-doing-all-the-time-4ill»