├── Android Keystore System ├── KeyChain.md └── KeyStore.md ├── LICENSE ├── README.md ├── assets ├── Alice-Bob-Mallory.png └── Alice-bob-eve.jpg ├── Библиотеки.md ├── Биометрия ├── Fingerprint (аутентификация ключей).md ├── Fingerprint (системный диалог).md └── Fingerprint (собственный дизайн).md ├── Защита сетевого слоя ├── Network Secruity Config.md ├── Public Key Pinning.md ├── WebView.md ├── Подписывание запросов.md └── Хранение и обновление токенов.md ├── Определение недоверенной среды ├── Root.md ├── SafetyNet.md ├── Небезопасный Wi-Fi.md └── Отладчик.md ├── Чек-лист безопасности.md └── Шифрование ├── Асиметричное.md ├── Симметричное.md ├── Хэширование.md └── Цифровые подписи.md /Android Keystore System/KeyChain.md: -------------------------------------------------------------------------------- 1 | # KeyChain 2 | TBD 3 | -------------------------------------------------------------------------------- /Android Keystore System/KeyStore.md: -------------------------------------------------------------------------------- 1 | # KeyStore 2 | TBD 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Android Security Cookbook 2 | 3 | * [Шифрование](https://github.com/Fi5t/android-security-cookbook/tree/master/%D0%A8%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)🛠 4 | * [Симметричное](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%A8%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/%D0%A1%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B5.md) 5 | * [Асиметричное](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%A8%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/%D0%90%D1%81%D0%B8%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B5.md) 6 | * [Хэширование](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%A8%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/%D0%A5%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5.md) 7 | * [Цифровые подписи](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%A8%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/%D0%A6%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D1%8B%D0%B5%20%D0%BF%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D0%B8.md) 8 | * [Управление ключами шифрования]()🛠 9 | * [Защита сетевого слоя](https://github.com/Fi5t/android-security-cookbook/tree/master/%D0%97%D0%B0%D1%89%D0%B8%D1%82%D0%B0%20%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BB%D0%BE%D1%8F) 10 | * [Public Key Pinning](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%97%D0%B0%D1%89%D0%B8%D1%82%D0%B0%20%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BB%D0%BE%D1%8F/Public%20Key%20Pinning.md) 11 | * [Network Security Config (API 24+)](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%97%D0%B0%D1%89%D0%B8%D1%82%D0%B0%20%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BB%D0%BE%D1%8F/Network%20Secruity%20Config.md) 12 | * [Подписывание запросов](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%97%D0%B0%D1%89%D0%B8%D1%82%D0%B0%20%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BB%D0%BE%D1%8F/%D0%9F%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2.md)🛠 13 | * [Хранение и обновление токенов](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%97%D0%B0%D1%89%D0%B8%D1%82%D0%B0%20%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BB%D0%BE%D1%8F/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B8%20%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%82%D0%BE%D0%BA%D0%B5%D0%BD%D0%BE%D0%B2.md)🛠 14 | * [WebView](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%97%D0%B0%D1%89%D0%B8%D1%82%D0%B0%20%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BB%D0%BE%D1%8F/WebView.md)🛠 15 | * [Определение недоверенной среды](https://github.com/Fi5t/android-security-cookbook/tree/master/%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BD%D0%B5%D0%B4%D0%BE%D0%B2%D0%B5%D1%80%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9%20%D1%81%D1%80%D0%B5%D0%B4%D1%8B)🛠 16 | * [Root](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BD%D0%B5%D0%B4%D0%BE%D0%B2%D0%B5%D1%80%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9%20%D1%81%D1%80%D0%B5%D0%B4%D1%8B/Root.md) 17 | * [SafetyNet](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BD%D0%B5%D0%B4%D0%BE%D0%B2%D0%B5%D1%80%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9%20%D1%81%D1%80%D0%B5%D0%B4%D1%8B/SafetyNet.md) 18 | * [Отладчик](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BD%D0%B5%D0%B4%D0%BE%D0%B2%D0%B5%D1%80%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9%20%D1%81%D1%80%D0%B5%D0%B4%D1%8B/%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA.md) 19 | * [Небезопасный Wi-Fi](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BD%D0%B5%D0%B4%D0%BE%D0%B2%D0%B5%D1%80%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9%20%D1%81%D1%80%D0%B5%D0%B4%D1%8B/%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA.md) 20 | * [Android keystore system](https://github.com/Fi5t/android-security-cookbook/tree/master/Android%20Keystore%20System)🛠 21 | * [KeyChain](https://github.com/Fi5t/android-security-cookbook/blob/master/Android%20Keystore%20System/KeyChain.md) 22 | * [KeyStore](https://github.com/Fi5t/android-security-cookbook/blob/master/Android%20Keystore%20System/KeyStore.md) 23 | * [ProGuard]()🛠 24 | * [Биометрия](https://github.com/Fi5t/android-security-cookbook/tree/master/%D0%91%D0%B8%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%8F)🛠 25 | * [Fingerprint (собственный дизайн)](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%91%D0%B8%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%8F/Fingerprint%20(%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B4%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD).md) 26 | * [Fingerprint (системный диалог)(API 28+)](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%91%D0%B8%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%8F/Fingerprint%20(%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%BD%D1%8B%D0%B9%20%D0%B4%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3).md) 27 | * [Fingerprint (аутентификация ключей)](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%91%D0%B8%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%8F/Fingerprint%20(%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%B9).md) 28 | * [Библиотеки](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8.md) 29 | * [Плагины]()🛠 30 | * [Внешние инструменты]()🛠 31 | * [Чек-лист безопасности](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%A7%D0%B5%D0%BA-%D0%BB%D0%B8%D1%81%D1%82%20%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D0%B8.md) 32 | -------------------------------------------------------------------------------- /assets/Alice-Bob-Mallory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fi5t/android-security-cookbook/77c6e510ab573afb60808b4e97b3fff4df7bf235/assets/Alice-Bob-Mallory.png -------------------------------------------------------------------------------- /assets/Alice-bob-eve.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fi5t/android-security-cookbook/77c6e510ab573afb60808b4e97b3fff4df7bf235/assets/Alice-bob-eve.jpg -------------------------------------------------------------------------------- /Библиотеки.md: -------------------------------------------------------------------------------- 1 | # Библиотеки 2 | 3 | В этом разделе собраны только те библиотеки, которые были неоднократно использованы в production и доказали свою полезность/безглючность. 4 | 5 | ## Шифрование 6 | 7 | - [Tink](https://github.com/google/tink) - решение от ребят из Google. Позволяет реализовать [AEAD](https://ru.wikipedia.org/wiki/AEAD-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC_%D0%B1%D0%BB%D0%BE%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F) шифрование с помощью AES/GCM (и не только). Полностью освобождает разработчика от мучительного выбора алгоритма шифрования и от управления ключами. Лучше использовать с `minSdk=23+`, т.к. только с этой версии можно хранить в keystore симметричные ключи. 8 | - [Jetpack Security](https://developer.android.com/jetpack/androidx/releases/security) - библиотека позволяет создавать зашифрованные SharedPreferences и файлы. Может служить заменой стандартным SharedPreferences (имеет тот же интерфейс). Базируется на [Tink](https://github.com/google/tink). 9 | - [java-aes-crypto](https://github.com/tozny/java-aes-crypto) - если вам нужно шифрование AES/CBC с проверкой целостности, то можно воспользоваться этой библиотекой. Библиотека состоит из одного файла, который по-сути явялется оберткой над стандартными средствами шифрования в Android, но абстрагирует разработчика от кучи деталей. 10 | 11 | ## Окружение 12 | 13 | - [rootbeer](https://github.com/scottyab/rootbeer) - простая и надежная библиотека для определения root-а и эмулятора. 14 | -------------------------------------------------------------------------------- /Биометрия/Fingerprint (аутентификация ключей).md: -------------------------------------------------------------------------------- 1 | # Fingerprint (аутентификация ключей) 2 | TBD 3 | -------------------------------------------------------------------------------- /Биометрия/Fingerprint (системный диалог).md: -------------------------------------------------------------------------------- 1 | # Fingerprint (системный диалог) 2 | TBD 3 | -------------------------------------------------------------------------------- /Биометрия/Fingerprint (собственный дизайн).md: -------------------------------------------------------------------------------- 1 | # Fingerprint (собственный дизайн) 2 | TBD 3 | -------------------------------------------------------------------------------- /Защита сетевого слоя/Network Secruity Config.md: -------------------------------------------------------------------------------- 1 | # Network Security Config 2 | 3 | Начиная с Android 7, появилась возможность управлять настройками сетевой безопасности без изменения исходного кода приложения. Представленный механизм получил название [**Network security configuration**](https://developer.android.com/training/articles/security-config). 4 | 5 | Основные возможности: 6 | 7 | * Использование сторонних, в том числе самоподписанных сертификатов для сетевых соединений 8 | * Отдельная сетевая конфигуация для debug-варианта прилиложения 9 | * Полный запрет незашифрованного (cleartext) трафика для приложения 10 | * Прикрепление (pinning) сертификатов 11 | 12 | ## Зачем это все нужно 13 | 14 | Приходит как-то тестировщик к разработчику и говорит: 15 | 16 | \- Не могу тестировать! Трафик на Charles не показывается! 17 | \- Как это не показывается? 18 | \- Откуда мне знать, на этом телефоне все норм, а на этом нет. Сертификаты проверил. 19 | 20 | --- 21 | 22 | Именно в этом момент появляется необходимость добавить в проект конфигуационный файл для NSС. 23 | 24 | ## Базовая настройка 25 | 26 | Для начала необходимо создать файл `network_security_config.xml` в каталоге `res/xml` с таким содержимым: 27 | 28 | ```xml 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | example.com 46 | 47 | fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE= 48 | 49 | 50 | 51 | ``` 52 | 53 | Теперь необходимо добавить ссылку на этот файл в `AndroidManifest.xml` следующим образом: 54 | 55 | ```xml 56 | 57 | 58 | 60 | ... 61 | 62 | 63 | ``` 64 | 65 | Формат NSC файла достаточно интуитивный и может быть использован в приведенном виде в большинстве проектов. Для этого нужно будет менять только доменное имя хэш ключа. Для реализации каких-то специфических сценариев потребуется изучить [полный формат файла](https://developer.android.com/training/articles/security-config#FileFormat). -------------------------------------------------------------------------------- /Защита сетевого слоя/Public Key Pinning.md: -------------------------------------------------------------------------------- 1 | # Public Key Pinning 2 | 3 | Сетевое соединение с применением TLS (HTTPS, WSS, etc...) является безопасным до тех пор, пока злоумышленник способен только слушать, но не подменять сетевой трафик. 4 | 5 | ![Alice-Bob-Eve](../assets/Alice-bob-eve.jpg) 6 | 7 | По [старой доброй традции](https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B8%D1%81%D0%B0_%D0%B8_%D0%91%D0%BE%D0%B1) пассивным слушателем обычно называют Еву, которая может в пассивном режиме перехватывать все, что пишут друг другу Алиса и Боб. Т.к. весь трафик между ними зашифрован, то ничего плохого не может произойти и Ева останется ни с чем. 8 | 9 | Но бывает и по-другому 10 | 11 | ![Alice-Mallory-Bob](../assets/Alice-Bob-Mallory.png) 12 | 13 | Такая ситуация возможна, если злоумышленник контролирует сетевое оборудование жертвы. Подробнее эта атака описана [здесь](https://ru.wikipedia.org/wiki/%D0%90%D1%82%D0%B0%D0%BA%D0%B0_%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D0%BA%D0%B0). Мы же сосредоточимся на защите от нее. 14 | 15 | ## Как сделать прикрепление сертификата 16 | 17 | Для начала определимся с терминологией. Очень часто люди называют разными именами одну и ту же вещь и об этом стоит помнить. Можно встретить такие называния этого механизма: 18 | 19 | - SSL pinning 20 | - TLS pinning 21 | - Public Key Pinning 22 | - Certificate pinning 23 | - Pinning (внезапно!) 24 | 25 | Чаще всего под этими всеми названиями имеется одно и то тоже, но если уверенности нет, то лучше уточнить. 26 | 27 | ### Откуда взять pin-ы 28 | 29 | Получить с помощью утилиты `openssl` введя в консоли команду `openssl s_client -connect host.com:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64`. На выходе получится строчка вида `pdkohGteOwFsD/BToXM7kZ2OfQmZrxHoB8k8Vl6eYJk=`. Это и будет pin. 30 | 31 | --- 32 | 33 | Получить с помощью библиотеки OkHttp (не обязательно из android приложения) c помощью такого кода: 34 | 35 | ```java 36 | String hostname = "publicobject.com"; 37 | CertificatePinner certificatePinner = new CertificatePinner.Builder() 38 | .add(hostname, "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") 39 | .build(); 40 | OkHttpClient client = OkHttpClient.Builder() 41 | .certificatePinner(certificatePinner) 42 | .build(); 43 | 44 | Request request = new Request.Builder() 45 | .url("https://" + hostname) 46 | .build(); 47 | client.newCall(request).execute(); 48 | ``` 49 | 50 | После выполнения этого кода, в консоле/logcat-е появятся строчки вида: 51 | 52 | ``` 53 | javax.net.ssl.SSLPeerUnverifiedException: Certificate pinning failure! 54 | Peer certificate chain: 55 | sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig=: CN=publicobject.com, OU=PositiveSSL 56 | sha256/klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY=: CN=COMODO RSA Secure Server CA 57 | sha256/grX4Ta9HpZx6tSHkmCrvpApTQGo67CYDnvprLg5yRME=: CN=COMODO RSA Certification Authority 58 | sha256/lCppFqbkrlJ3EcVFAkeip0+44VaoJUymbnOaEUk7tEU=: CN=AddTrust External CA Root 59 | Pinned certificates for publicobject.com: 60 | sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= 61 | at okhttp3.CertificatePinner.check(CertificatePinner.java) 62 | at okhttp3.Connection.upgradeToTls(Connection.java) 63 | at okhttp3.Connection.connect(Connection.java) 64 | at okhttp3.Connection.connectAndSetOwner(Connection.java) 65 | ``` 66 | Нас будет интересовать самый первый pin `sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig=` 67 | 68 | --- 69 | 70 | Попросить ваших backend-разработчиков дать вам sha256 хэш от публичного ключа сертификата сервера. 71 | 72 | ### Рекомендуемая реализация (с помощью OkHttp) 73 | 74 | Скорее всего в вашем проекте уже используется эта библиотека и вам нужно будет просто модифицировать **Builder** с помощью которого создается HTTP-клиент, следующим образом: 75 | 76 | ```kotlin 77 | val builder = OkHttpClient.Builder() 78 | ... 79 | .certificatePinner(getPinner()) 80 | ... 81 | 82 | private fun getPinner(): CertificatePinner { 83 | val host = Uri.parse(WEBAPI_URL).host 84 | val sha256Cert = "pdkohGteOwFsD/BToXM7kZ2OfQmZrxHoB8k8Vl6eYJk=" 85 | return if (BuildConfig.DEBUG) { 86 | CertificatePinner.DEFAULT 87 | } else { 88 | CertificatePinner.Builder() 89 | .add(host, "sha256/$sha256Cert") 90 | .build() 91 | } 92 | } 93 | ``` 94 | 95 | ### Альтернативная реализация (Network Security Config) 96 | 97 | Если минимальная поддерживаемая версия API для в вашем проекте равна **24**, тогда можно последовать рекомендациям OWASP и сделать прикрепление с помощью одного лишь Network Security Config, как это показано [здесь](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%97%D0%B0%D1%89%D0%B8%D1%82%D0%B0%20%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BB%D0%BE%D1%8F/Network%20Secruity%20Config.md). 98 | 99 | ### Реализация для аскетов (HttpUrlConnection) 100 | TBD 101 | 102 | ### Реализация для дзен-буддистов (NDK) 103 | TBD 104 | 105 | ## Полезные ссылки 106 | 107 | - [Все, что необходимо знать о технологии HTTP Public Key Pinning (HPKP)](https://www.securitylab.ru/analytics/479602.php) 108 | - [OWASP Certificate and Public Key Pinning (en)](https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning) 109 | - [Security with HTTPS and SSL (en)](https://developer.android.com/training/articles/security-ssl) 110 | -------------------------------------------------------------------------------- /Защита сетевого слоя/WebView.md: -------------------------------------------------------------------------------- 1 | # WebView 2 | TBD 3 | -------------------------------------------------------------------------------- /Защита сетевого слоя/Подписывание запросов.md: -------------------------------------------------------------------------------- 1 | # Подписывание запросов 2 | TBD 3 | -------------------------------------------------------------------------------- /Защита сетевого слоя/Хранение и обновление токенов.md: -------------------------------------------------------------------------------- 1 | # Хранение и обновление токенов 2 | TBD 3 | -------------------------------------------------------------------------------- /Определение недоверенной среды/Root.md: -------------------------------------------------------------------------------- 1 | # Root 2 | TBD 3 | -------------------------------------------------------------------------------- /Определение недоверенной среды/SafetyNet.md: -------------------------------------------------------------------------------- 1 | # SafetyNet 2 | TBD 3 | -------------------------------------------------------------------------------- /Определение недоверенной среды/Небезопасный Wi-Fi.md: -------------------------------------------------------------------------------- 1 | # Небезопасный Wi-Fi 2 | TBD 3 | -------------------------------------------------------------------------------- /Определение недоверенной среды/Отладчик.md: -------------------------------------------------------------------------------- 1 | # Отладчик 2 | TBD 3 | -------------------------------------------------------------------------------- /Чек-лист безопасности.md: -------------------------------------------------------------------------------- 1 | # Чек-лист безопасности 2 | *список будет редактироваться по мере необходимости* 3 | 4 | Перед релизом приложения необходимо проверить что... 5 | 6 | **1. Пароли, ключи шифрования, токены и всю остальная чувствительная информация не хранится в открытом виде** 7 | 8 | В открытом = в незашифрованном. Типичные места хранения: строковые константы, shared preferences, базы данных и просто обычные файлы. 9 | 10 | 11 | **2. Используются надежные ключи шифрования.** 12 | 13 | Для выработки ключевого материала используются специальные алгоритмы (например PBKDF2). Если ключи вырабатываются на основании пользовательского ввода (и особенно pin-кодов), то ввод необходимо преобразовывать и [солить](https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BB%D1%8C_(%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F)) перед передачей алгоритмам генерации ключей. 14 | 15 | 16 | **3. Используются надежные алгоритмы шифрования** 17 | Для большинства задач вполне хватает алгоритма AES-128 в режиме CBC. При необходимости можно использовать RSA-4096. Алгоритм DES (в т.ч. TripleDES) использовать **нельзя**. 18 | 19 | 20 | **4. Любые сетевые запросы выполняются по протоколу https** 21 | 22 | 23 | **5. Включен SSL Pinning и убраны методы для его отключения** 24 | 25 | SSL Pinning включается либо на уровне [OkHttp](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%97%D0%B0%D1%89%D0%B8%D1%82%D0%B0%20%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BB%D0%BE%D1%8F/Public%20Key%20Pinning.md#%D1%80%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D1%83%D0%B5%D0%BC%D0%B0%D1%8F-%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-okhttp) , либо в [манифесте приложения](https://github.com/Fi5t/android-security-cookbook/blob/master/%D0%97%D0%B0%D1%89%D0%B8%D1%82%D0%B0%20%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BB%D0%BE%D1%8F/Network%20Secruity%20Config.md) 26 | 27 | 28 | **6. Отключен кэш WebView** 29 | 30 | ```kotlin 31 | with(webView.settings) { 32 | setAppCacheEnabled(false); 33 | setCacheMode(WebSettings.LOAD_NO_CACHE); 34 | } 35 | ``` 36 | 37 | 38 | **7. Запрещен доступ к файловой системе из WebView** 39 | 40 | ```kotlin 41 | with(webView.settings) { 42 | setJavaScriptEnabled(false); 43 | setAllowFileAccessFromFileURLs(false); 44 | } 45 | ``` 46 | 47 | 48 | **8. В SQL запросах фильтруются кавычки и весь остальной мусор или используется SQLiteQueryBuilder** 49 | 50 | 51 | **9. Из манифестов всех модулей приложения убраны “allowBackup” и “debuggable”** 52 | 53 | 54 | **10. Экспортируются только те, компоненты, которые должны экспортироваться** 55 | Подробности [здесь](https://developer.android.com/guide/topics/manifest/activity-element.html?q=exported) 56 | 57 | 58 | **11. В широковещательных сообщениях не раскрывается чувствительная информация** 59 | 60 | 61 | **12. При получении широковещательных сообщений проверяется источник** 62 | 63 | 64 | **13. Присутствует проверка и фильтрация данных, приходящих из внешних интентов.** 65 | 66 | 67 | **14. Все экспортируемые компоненты максимально изолированы от остального кода** 68 | 69 | 70 | **15. Выключены все логи.** 71 | 72 | --- 73 | 74 | Плюс к этому в приложениях, требующих повышенного уровня безопасности (например банковские) необходимо: 75 | 76 | * Включить ProGuard 77 | * Убедиться, что нельзя делать скриншоты 78 | * Реализовать способы обнаружения недоверенной среды (root, debug, etc) 79 | * Реализовать механизмы проверки целостности кода. 80 | * Проверить, что критически важные данные и алгоритмы находятся в нативном коде 81 | -------------------------------------------------------------------------------- /Шифрование/Асиметричное.md: -------------------------------------------------------------------------------- 1 | # Асиметричное шифрование 2 | TBD 3 | -------------------------------------------------------------------------------- /Шифрование/Симметричное.md: -------------------------------------------------------------------------------- 1 | # Симметричное шифрование 2 | TBD 3 | -------------------------------------------------------------------------------- /Шифрование/Хэширование.md: -------------------------------------------------------------------------------- 1 | # Хэширование 2 | TBD 3 | -------------------------------------------------------------------------------- /Шифрование/Цифровые подписи.md: -------------------------------------------------------------------------------- 1 | # Цифровые подписи 2 | TBD 3 | --------------------------------------------------------------------------------