├── 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 | 
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 | 
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 |
--------------------------------------------------------------------------------