Что должны знать веб-программисты о криптографии? [закрыто]

27

Должны ли программисты, которые создают веб-сайты / веб-приложения, понимать криптографию? Я понятия не имею, как работает большинство криптографических алгоритмов, и я действительно не понимаю различий между md5 / des / aes / etc. Кто-нибудь из вас нашел необходимость в глубоком понимании криптографии?

Мне это не нужно, но мне интересно, возможно, я что-то упускаю. Я использовал соль + md5 хеш для шифрования паролей, и я говорю веб-серверам использовать SSL. Кроме того, я не могу сказать, что я использовал многое другое, и я не могу с уверенностью сказать, насколько безопасны эти методы. Я использую их только потому, что другие люди утверждают, что они в безопасности.

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

davidhaskins
источник
4
Они должны знать достаточно, чтобы знать, что они не должны этого делать.
SLaks
@SLaks: +1 100% согласен. Я написал ответ в этой теме, чтобы узнать, почему это так.
Крис Джестер-Янг

Ответы:

41

Веб-программисты должны знать, что они никогда не должны пытаться реализовать криптографию самостоятельно.

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

Зачем? Потому что в противном случае люди вводят в заблуждение, думая, что:

  • AES-256 - это «отличное шифрование», несмотря на то, что они используют его в режиме ECB или используют неслучайные значения IV и т. Д. (В некоторых режимах не случайные, но уникальные IV приемлемы. В других не так много.)
  • Они могут использовать один и тот же симметричный ключ для шифрования нескольких сообщений (или, что еще хуже, сохранить симметричный ключ в коде для непосредственного использования).
    • Они могут даже решить использовать парольную фразу в качестве ключа напрямую, без использования каких-либо функций вывода ключа.
  • Они могут использовать RSA для шифрования данных напрямую.
  • Они могут просто «солить и MD5» свои пароли, чтобы сохранить их в безопасности. (Если вы считаете, что радужные таблицы являются самым слабым звеном, подумайте еще раз .)

Просто чтобы быть на той же странице, ни один из вышеперечисленных пунктов не в порядке . Если вы этого не понимаете, то не стоит трогать крипто 10-футовым шестом! (AES-256 - отличное шифрование, но только если вы правильно его используете. «Не размер имеет значение, а то, что вы делаете с ним». :-))

О каких функциях высокого уровня я говорю? Я лично рекомендую использовать библиотеку OpenPGP (для данных в покое) или SSL (для данных в движении). Эти протоколы жестко определяют правильное использование асимметричных, симметричных и хеш-алгоритмов. Например, с OpenPGP:

  • Он не использует RSA для непосредственного шифрования данных, а вместо этого генерирует случайный (симметричный) ключ сеанса для каждого сообщения (это важно) и использует RSA для шифрования этого ключа сеанса.
  • Он использует функцию вывода ключей для преобразования парольных фраз в ключи. (На языке OpenPGP это называется S2K, но я думаю, что «функция получения ключа» - более стандартный термин.)
  • Он позволяет выбрать хороший режим, поэтому вы никогда не будете использовать ECB.
  • Он обрабатывает управление ключами для вас, поэтому вам не нужно принимать специальные решения о том, какие ключи заслуживают доверия и т. Д.

Резюме: если вы не эксперт по безопасности и думаете на уровне AES, или SHA-1, или (не дай бог) MD5, вы делаете это неправильно . Используйте библиотеку, написанную экспертами по безопасности (например, Bouncy Castle), которая реализует протоколы, разработанные экспертами по безопасности (например, OpenPGP для шифрования, или bcrypt или scrypt для хеширования паролей), вместо того, чтобы использовать свой собственный.

Я ни в коем случае не специалист по криптографии, но знаю достаточно, чтобы не пытаться разрабатывать свои собственные специальные протоколы. Просто чтобы прояснить, весь этот пост - материал Cryptography 101 . Так что, если этот пост не имеет для вас 100% смысла, то вам определенно не стоит приближаться к криптографии.

Крис Шут-Янг
источник
4
здорово. понравился пост в блоге, связанный с «подумай еще раз». chargen.matasano.com/chargen/2007/9/7/…
davidhaskins
+1, но использовать один и тот же симметричный ключ несколько раз - это нормально. Вот для чего нужен IV (иначе он вам не понадобится).
2012 года
1
Кроме того, Колин Персиваль из Scrypt (и других) знаменитостей имеет отличную статью под названием «Криптографические правильные ответы», в которой излагаются криптографические решения, которые вам необходимо принять. SSL очень проблематичен (отзыв ключа очень сложно реализовать). Более подробная информация здесь: daemonology.net/blog/...
orip
@orip Согласен, хотя я бы сказал, что использование одного и того же ключа с другим IV обычно более полезно для случая, когда ваше сообщение длиннее, чем размер блока выбранного вами симметричного шифра, а не для отдельных сообщений, где у вас нет контекст для отслеживания IV, используемых для предыдущих сообщений. Также согласен со статьей Колина Персиваля.
Крис Шестер-Янг
1
@Послушай, я изменил ссылку на что-то более актуальное.
Крис Джестер-Янг,
14

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

Основные области безопасности, которые вы обязательно должны знать как веб-разработчик:

  1. SQL-инъекция. Вероятно, это самая опасная дыра, которую веб-разработчик может пробить в системе.
  2. Межсайтовый скриптинг и куки.
  3. Спам-боты и капчи.
  4. SQL-инъекция. Нельзя подчеркнуть, насколько это важно.
biziclop
источник
Ничего не понимая в том, что ты делаешь, очень опасно. Не зная, в чем разница между хешем дайджеста сообщений и криптографическим хешем, вы можете разрушить вас. Не знание, как солить, может разрушить вас.
Инкогнито
@ user1525 Вот что я имел в виду как основы криптографии. Вам определенно не нужно знать, как на самом деле работает любой из алгоритмов шифрования.
Бизиклоп
Я ценю ответ, и я согласен с SQL-инъекцией и другими атаками, но я действительно спрашивал о криптографии.
Дэвидхаскинс
2
@davidhaskins Да, я просто подумал, что стоит указать, потому что каждый уровень основывается на предыдущем. Знание того, как работает AES, ничего не стоит, если вы не можете защитить свое приложение на более базовом уровне. По моему опыту, это ловушка, в которую попадают многие разработчики (я делал это несколько раз), чтобы сконцентрироваться на шифровании и упустить из виду свою роль в длинной цепи безопасности.
Бизиклоп
4

Я помню, как я видел эту беседу под названием « Что каждый инженер должен знать о безопасности и где ее изучать», выступающий - Нил Дасвани, и это - Google Tech Talk, который он дал, может быть хорошим началом!

Хотя это относится не только к веб-программистам, возможно, вопрос следует переименовать в «Что должны знать программисты о безопасности?» поскольку им не нужно знать больше, чем основы криптографии (как бы это ни было интересно)


источник
2

Crypto пригодится во многих ситуациях. В качестве примера мы использовали шифрование файла cookie сеанса, созданного и установленного хостом Win / IIS для использования на хосте LAMP.

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

Майкл
источник
2

На мой взгляд, вы должны знать все о криптографии, которую знает кто-то, кто атакует ваш код. Вы должны понимать хэши, соль, неслучайность случайности, основные алгоритмы шифрования (RSA, 3DES, AES и т. Д.), SHA-1 / MD-5 / et al. Вам не нужно запоминать их, но вы должны хотя бы знать, насколько эффективен алгоритм хеширования и как его усилить. Вы должны знать, что такое коллизии и ложные срабатывания. Вы не должны быть в состоянии перечислить алгоритмы шифрования, но вы должны быть знакомы с их тестами, которые идеально подходят для каких сценариев. Вы должны быть в состоянии описать и объяснить симметричное или асимметричное шифрование и когда использовать каждый из них. Вы должны знать, что такое PKI и как его использовать. Вы должны знать, что такое центр сертификации и как он взаимодействует с вашими серверами.

Знание всех деталей не так важно, как знание его основ. Каковы критерии определенных вещей (как быстро, как сильно, слабости и т. Д.).

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

Джоэл Этертон
источник
2

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

См. Как безопасно хранить пароль для получения дополнительной информации.

chrisaycock
источник
0

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

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

Омар Коля
источник