Веб-программисты должны знать, что они никогда не должны пытаться реализовать криптографию самостоятельно.
В частности, это означает, что ни один эксперт, не связанный с безопасностью, не должен напрямую касаться ни одного из криптографических примитивов. Они не должны думать на уровне 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% смысла, то вам определенно не стоит приближаться к криптографии.