Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Храни секреты правильно

MOSDROID
September 18, 2017

Храни секреты правильно

Артём Кулаков RedMadRobot

Большинство android-разработчики сталкиваются с потребностью безопасного хранения секретной информации. Результат таких столкновений - Google Play, заполненный приложениями, в которых безопасность отсутствует как класс. В докладе разберем типичные ошибки, которые допускают разработчики при хранении секретной информации, и рассмотрим варианты решения этих проблем.

#MOSDROID

MOSDROID

September 18, 2017
Tweet

More Decks by MOSDROID

Other Decks in Programming

Transcript

  1. Keep
    Secrets
    Right

    View full-size slide

  2. WHOAMI
    - пишу Android приложения
    - интересуюсь безопасностью приложений и серверов
    - могу что-нибудь взломать на досуге ;)
    - в свободное время помогаю OpenSource проектам
    Android Lead в Redmadrobot
    Артем Кулаков
    2
    Twitter: @Fi5t

    Telega: https://t.me/android_guards

    View full-size slide

  3. План доклада
    3
    - Хранение секретной информации
    - Проблемы шифрования
    - Генерация надежных ключей
    - Где хранить ключи?
    - Итоги

    View full-size slide

  4. Соглашения
    4
    Sensitive information == “чувствительная
    информация” == конфиденциальная
    информация == секретная информация

    View full-size slide

  5. Виды секретов
    5
    - Персональные данные пользователя
    - Токены доступа
    - Служебные файлы приложения
    - Придумайте свой вариант…

    View full-size slide

  6. Хранение секретов
    (популярный подход)
    6

    View full-size slide

  7. Хранение секретов
    (правильный подход)
    7
    - Не хранить вообще
    - Хранить на backend/middleware
    - Шифровать

    View full-size slide

  8. Как не хранить секреты
    8
    - Не хардкодить аккаунты, “суперсистемные”
    токены и прочую секретную информацию
    - Не сохранять персональные данные пользователя
    на диске
    - Не использовать “секретные конфиги” вида
    disableSSL=false

    View full-size slide

  9. Как не хранить секреты
    9
    Вывод: понять какие данные являются
    секретными для вашей доменной области и
    отказаться от их хранения.

    View full-size slide

  10. Как хранить на сервере
    10
    - Весь обмен с сервером только по HTTPS + SSL
    Pinning
    - Все секретные данные лежат на сервере и
    запрашиваются в realtime и не кэшируются
    - Токены имеют адекватно-короткое время жизни
    и обновляются

    View full-size slide

  11. Как хранить на сервере
    11
    Вывод: приложение становится максимально
    тонким клиентом.

    View full-size slide

  12. Как шифровать
    12

    View full-size slide

  13. Шифрование. Племенная мифология.
    13
    - Это сложно (spoiler: да)
    - Нужно знать матан, дифуры и квантовую физику
    - Медленно и дорого
    - Никто не знает где хранить ключи

    View full-size slide

  14. Главная проблема криптографии
    14
    Управление ключами
    Стоимость руководителя контрразведки ЦРУ вместе с женой не
    превысила двух миллионов долларов. Это намного дешевле, чем
    создавать крупные компьютеры для взлома и нанимать гениальных
    криптоаналитиков.
    Б. Шнайер

    View full-size slide

  15. Виды ключей
    15
    - симметричные (AES, DES)
    - асимметричные (RSA, Diffie-Hellman)

    View full-size slide

  16. Создание надежных ключей
    16
    1. Взять за основу пользовательский ввод
    2. Взять соль и/или перец (salt + pepper)
    3. Смешать все вместе и скормить хэш-функции
    4. ??????
    5. PROFIT!!!

    View full-size slide

  17. Создание надежных ключей
    17
    - HMAC-SHA1 в качестве PRF
    - 64 бита соль
    - 10k итераций
    PBKDF2
    Альтернативы: bcrypt/scrypt, Argon2

    View full-size slide

  18. Где хранить ключи?
    18
    - В голове пользователя (PBKDF2 and etc.)
    - В железе (TEE, SEP)
    Там, откуда их сложно извлечь без паяльника на 100W ;)

    View full-size slide

  19. Android way
    19
    - Trusted Execution Environment
    - Secure Element
    - Keystore & KeyChain

    View full-size slide

  20. KeyChain vs Keystore
    20
    - KeyChain: общесистемное хранилище
    - Keystore: индивидуальное хранилище для каждого приложения

    View full-size slide

  21. KeyChain
    21
    - Android 4.0+
    - Можно хранить PKCS#12 (private key + X.509 CA)
    - Можно хранить в железе (Android 4.3+)
    - Нельзя грабить корованы и хранить симметричные ключи
    =(

    View full-size slide

  22. Keystore
    22
    - Android 4.3+
    - Нельзя извлечь из памяти приложения
    - Можно хранить в железе
    - Поддерживаются асимметричные ключи и симметричные
    ключи (Android 6+)
    - Поддержка Fingerprint auth API

    View full-size slide

  23. Проблемы Keystore
    23
    - Удаление ключей при изменении типа блокировки
    экрана (баг или фича?)
    - Key blob можно расшифровать (но это неточно)
    - Ключи остаются на устройстве после удаления
    приложения если в его манифесте было
    allowBackup=true

    View full-size slide

  24. Итоги
    24
    - Нельзя ничего хранить на устройстве
    - Хочешь хранить? Шифруй.
    - Хочешь шифровать? Не храни ключи!
    - Хочешь хранить? Страдай…

    View full-size slide

  25. Полезные ссылки
    25
    - Android Keystore System - https://goo.gl/wMCoHC
    - Keystore redesign in Android M - https://goo.gl/Qdd1BV
    - The Forgetful Keystore - https://goo.gl/x6Cz6w
    - Unifying Key Store Access in ICS - https://goo.gl/2nXydS
    - Applied Cryptography - https://goo.gl/mNwKrQ
    - Android Security Internals - https://goo.gl/xEL1Pd

    View full-size slide

  26. Any questions?

    View full-size slide