Задачи шифрования
С помощью шифрования решаются следующие задачи:
- Конфиденциальность - скрытие информации от посторонних лиц при передаче или при хранении.
- Целостность - предотвращение изменения информации при передаче или хранении.
- Идентифицируемость - аутентификация источника информации и предотвращение отказа отправителя информации от того факта, что данные были отправлены именно им.
Базовые понятия шифрования
Симметричные и ассиметричные схемы шифрования
В симметричных схемах для шифрования и расшифровки используется один и тот же криптографический ключ. Главная проблема симметричных схем - ключ нельзя передавать по открытому (доступному для наблюдения, незащищенному) каналу, т. е. ключ должен сохраняться в секрете обеими сторонами обмена информацией.
В 1977 году были изобретены ассиметричные схемы RSA (аббревиатура от фамилий Rivest, Shamir и Adleman) — криптографический алгоритм с открытым ключом, основывающийся на вычислительной сложности задачи факторизации больших целых чисел.
В ассиметричных схемах или криптографических системах с открытым ключом, используются два ключа, по одному из которых можно только шифровать информацию, а по другому только расшифровывать криптотекс. Открытый ключ (для шифрования) не является секретным и его передают по незащищенному каналу, а закрытый ключ для расшифровки хранят в тайне. Основной недостаток ассиметричных схем - сложность (ресурсоемкость) решаемой математической задачи подбора ключей и операций шифрования/расшифровки, также больший по объему криптотекс для передачи.
Хэш
От любой информации, будь то файл или строка данных, можно вычислить хэш, который может быть представлен в виде N-символьного (шестнадцатеричного) числа. Хэш обычно меньше исходной информации и часто используется для проверки целостности (неизменности) информации. При этом хэш-фунции должны удовлетворять следующим требованиям:- Необратимость хэширования: достаточно просто вычислить хэш от исходных данных, но невозможно (за реальное время) решить задачу вычисления данных зная хэш
- Стойкость к коллизиям: не может быть двух одинаковых хэш от разных входных данных (и обратное)
SSL и HTTPS

В WEB задачи безопасного подключения решаются с помощью защищенных протоколов SSL (англ. Secure Sockets Layer — уровень защищённых cокетов) и HTTPS (аббр. от англ. HyperText Transfer Protocol Secure) SSL - протокол работает на представительском уровне, производит генерацию и проверку ключей, шифрование и расшифрование данных (согласно модели ISO/OSI), в то время как HTTPS - это обычный протокол HTTP расположенный поверх SSL и использующий порт 443.
SSL-сертификаты
Протокол SSL использует сертификаты сервера (сайта) для аутентификации. Сертификат содержит закрытый и открытый ключи шифрования и дополнительные данные (кем и кому выдан, назначение, сроки действия сертификата и др.).
Сертификаты защищают пользователя от атак человек по середине, когда злоумышленник может выдавать себя за ресурс (сервер) и подложить клиенту свой открытый ключ. Тогда дело вступает третья сторона, которой доверяют обе стороны обмена секретной информацией - центр сертификации. Браузеры уже содержат сведения о доверенных корневых центрах сертификации, и если ваш сертификат выдан одним из них (или его дочкой имеющей право выдачи сертификатов), браузер может проверить путь сертификации и убедиться принадлежности открытого ключа шифрования запрашиваемому серверу.

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

Стандарты шифрования. Стойкость алгоритмов SSL
В настоящее время алгоритмы шифрования хорошо изучены, описаны спецификациями и стандартизированы RFC.
Пока не доказано существование необратимых функции шифрования на основе ассиметричных алгоритмов и хэширования, задача расшифровки шифротекста является лишь вычислительно сложной. Для алгоритмов RSA можно рассматривать только ключи длинной 1024 бита и более. С 31 декабря 2013 года браузеры Mozilla перестали поддерживать сертификаты удостоверяющих центров с ключами RSA меньше 2048 бит.
Реализация крипто-алгоритмов в Linux и Windows
На Linux наиболее распространённая реализация SSL — криптографический пакет с открытым исходным кодом OpenSSL, основанный на SSLeay, написанной Эриком Янгом. Пакет предназначен для создания и управления различного рода сертификатами. Также в его состав входит библиотека для поддержки SSL различными программами. Библиотека используется, например, модулем SSL в распространенном HTTP-сервере Apache.
В Windows - системах изготовить самоподписанный ssl-сертификат можно с помощью power shall.
Браузеры могут использовать свои криптографические библиотеки, которые не являются открытыми в отличие от Open SSL и могут быть защищены авторскими правами:
- Google Chrome on Android uses OpenSSL
- NSS (for all firefox and chrome in Linux)
- SChannel (for browsers in Windows)
- Secure Transport (for browsers in Mac OS X)
Упрощенная схема https соединения
HTTPS для создания защищенного соединения использует ассиметричное шифрование для выработки секретного симметричного сессионного ключа, т. е. применяются обе схемы шифрования.
Не углубляясь в подробности процесса рукопожатий, параметры выработки ключей и алгоритмов шифрования рассмотрим упрощенную схему https-подключения:- Вы открываете в браузере сайт https://ok.ru (одноклассники)
- Одноклассники отправляют вашему браузеру сертификат, содержащий открытый ключ
- Ваш браузер проверяет сертификат открытого ключа
- Если сертификат действительный, браузер вырабатывает секретный симметричный сессионный ключ, шифрует его открытым ключом сертификата и отправляет на сервер одноклассники
- Сервер ok.ru расшифровывает секретный симметричный сессионный ключ своим закрытым ключом
- Далее трафик между вашем ПК и одноклассниками шифруется более быстрыми симметричными алгоритмами на секретном симметричном сессионном ключе
Правила шифрования данных пользователя
Из данных пользователя на вашем сайте шифровать следует как минимум пароли, которые не должен знать никто кроме пользователя. Но если пароли пользователей совпадут, то совпадет и хэш от них. Для защиты к паролю пользователя добавляют случайные данные (криптографическую соль) и уже от их суммы вычисляют хэш и сохраняют соль и хэш в базу данных. При авторизации к паролю прибавляют сохраненную соль, вычисляют хэш и сравнивают с сохраненным хэш в базе данных. Обычно после сразу создают новую соль и вычисляют новый хэш и обновляют их в БД. Таким образом никто кроме пользователя не может знать пароль. Проблема восстановления пароля в таком случае решается его сбросом.
На php для хэширования паролей рекомендовано использовать безопасную функцию password_hash с автоматической генерацией сложной соли и не требующий раздельного хранения хэш и соли, а для проверки использовать функцию password_verify
Выводы:
В настоящее время идет тенденция к тому, что все сайты в интернет должны быть безопасными. Более того, ни один серьезный ресурс не станет передавать небезопасно на ваш сервер личные данные клиентов (ФИО, паспортные данные, банковские реквизиты, логины и пароли и т.п.)
Для передачи конфиденциальной информации необходимо использовать безопасные https-соединения. Только в таком случае вы можете быть уверены что данные не будут расшифрованы даже при перехвате их злоумышленниками.