Как установить действительно безопасное соединение между iOS app и XMPP сервером
Итак, идея заключается в том, чтобы установить действительно безопасное соединение между iOS app и XMPP сервером с целью предотвращения любых возможных спуфингов, снифингов, атак вида Man in the middle, Replay и других. После нескольких дней поисков я пришел к следующей модели. Пожалуйста, дайте знать, достаточно ли она безопасная или я что-то упустил или что-то можно улучшить.
Установка безопасного соединения с XMPP сервером
Соединение может быть установлено только с одним конкретным XMPP сервером, жестко зашитым в код приложения.
Доступ к серверу без шифрования запрещен, только SSL/TLS.
Соединение может быть установлено только в том случае, если SSL сертификат сервера считается валидным.
Для того, чтобы предотвратить MITM в случае скомпрометированности корневого CA сервера, используется SSL pinning, то есть публичный ключ сервера сразу же зашивается в код приложения.
OTR
Любая беседа внутри приложения ведется с использованием шифрования OTR версии 3.
Подлинность собеседника устанавливается при помощи SIGMA алгоритма, на котором базируется OTR, таким образом мы предотвращаем возможные MITM атаки. Верно?
TOR
Даже если оба OTR и SSL будут взломаны (разве это возможно в этой конфигурации?), клиент всегда соединяется с сервером только через TOR сеть, что позволяет ему маскировать свой оригинальный IP.
Нужно ли что-то добавить к этой конфигурации, чтобы считать ее совсем защищенной? Нужно ли SSL оборачивать еще в какой-то протокол на случай, если в SSL присутствуют backdoor? Во что?
Смотря от чего вы желаете защититься. Судя по накрученности защиты, вы собрались защищаться от правительства. А у него есть рычаги, чтобы надавить на Apple и заставить удаленно установить бэкдор, который сделает всю защиту бесполезной.
С каким конкретно сервером вы хотите соединяться? С произвольным либо своим собственным?
Если со своим собственным, то вам все равно, что там будет за сертификат, хоть самоподписанный, даже CA не нужен, проверяете через pinning и все ОК.
Если соединяться с другими серверами (произвольными?), как вы будете мониторить, поменялся ли у них сертфикат или нет? Только после жалоб пользователей что все отвалилось, вы действительно удостоверитесь, что сертификат поменялся и начнете выпускать новую версию?
p.s. на самом деле вам еще (пробегала инфа где-то тут) предстоит пободаться с Apple в проталкивании приложения в AppStore. Там какие-то жуткие ограничения на использование криптографии.
Соединяться буду со своим собственным сервером, так что буду делать pinning.
Про шифрование в App Store очень интересно, а где можно про ограничения узнать, кто-нибудь знает?
ну тогда уж до кучи tls 1.1(2), pfs, dh, ecc… хотя тоже вот странно, вы создаете приложение, где замыкаете всех на свой сервер. логи писать будете? товарищу майору сдавать?(sarcasm), но все же… никому нельзя верить)
про шифрование вот нашлось habrahabr.ru/post/126201/, наверняка нагуглите еще
если честно, я не рекомендую вам изобретать велосипед, а присоедениться к уже одному существующему проекту и добавить свои идеи. здесь github.com/chrisballinger/Off-the-Record-iOS
убойное сочетание… iOS приложение, с исходниками, да еще и шифрование делает. редко встретишь)
Тут мне в голову пришла мысль — почему бы не использовать i2p вместо tor? В общем-то, он решает все поставленные вами задачи. Разве что второй уровень добавить на случай бэкдора.
Я вот тоже склоняюсь к тому, что нужно делать p2p. Единственное, что останавливает — p2p это совсем не готовое решение, его нужно сидеть и придумывать, тщательно продумывая детали. И с точки разработки тоже гораздо дороже будет и больше багов будет. Что думаете?