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

Modern Security for Android Developers

Modern Security for Android Developers

Modern Security in Android (part 1)
A fast guide to be safe
Dinorah Tovar
Dinorah Tovar
May 24 · 5 min read

This presentation is related to my lastest serial “Modern Security for Android Developers”.

Here is the list of the blogs in this series:
Part 1 — Encryption Vol 1
Part 2 — Encryption Vol 2
Part 3 — Encryption Vol 3
Part 4 — Biometric as Local Auth
Part 5 — Native Code Modules
Part 6 — SSL, TLS, Secure Data layer
Part 7 — Android 11

For English: https://medium.com/knowing-android/modern-security-in-android-part-1-6282bcb71e6c
For Spanish: https://medium.com/droid-latam/seguridad-moderna-para-android-developers-parte-1-e4069e4eb99f

Dinorah Tovar

June 30, 2020
Tweet

More Decks by Dinorah Tovar

Other Decks in Technology

Transcript

  1. SEGURIDAD MODERNA
    PARA ANDROID

    DEVELOPERS
    Dinorah Tovar
    Platform Mobile Engineer
    @ddinorahtovar
    @ddinorahtovar
    @dinorahto
    @dinorahto
    Doing code @ Konfío

    View Slide

  2. Hablemos sobre
    seguridad

    View Slide

  3. • En el 2018 Android obtuvo 0 critical security vulnerabilities
    • El 84% de los dispositivos tuvieron updates de parches de
    seguridad, asegurándonos que nuestros dispositivos están libres
    de posibles bugs
    • En el futuro, deberíamos buscar Privacidad, Actualizaciones
    continuas y Endurecimiento
    Seguridad en Android

    View Slide

  4. En Android 10
    Privacidad Actualizaciones Endurecimiento

    View Slide

  5. Encriptación en
    Android: Vol 1

    View Slide

  6. Encriptación en Android
    “Es el proceso de codificación de la información de un
    usuario en un dispositivo Android, usando llaves
    simétricas”

    View Slide

  7. Encriptación en Android

    Algorithm
    Data
    Key
    Cipher
    Text

    View Slide

  8. Encriptación en Android
    Cipher Mac
    Signature Message Digest

    View Slide

  9. Encriptación en Android

    View Slide

  10. Encriptación en Android
    val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
    Algorithm
    Model
    Padding

    View Slide

  11. Encriptación en Android
    •Existen muchos tipos de estándares como:

    Advanced Encryption Standard (AES)

    Rivest–Shamir–Adleman (RSA)
    •Modos de operación para llaves simétricas y no simétricas
    •Paddings para encriptar data larga y corta

    View Slide

  12. La encriptación es un proceso de hardware o de software?
    Encriptación en Android
    DEPENDE

    View Slide

  13. Encriptación en Android
    •Hardware acceleration
    •Android Version
    android:name=".YourApp"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:hardwareAccelerated="true"/>

    View Slide

  14. Encriptación en
    Android: Vol 2

    View Slide

  15. Encriptación en Android

    View Slide

  16. Encriptación en Android

    View Slide

  17. Encriptación en Android
    • Mejores practicas, relacionadas a la escritura y lectura de data
    segura, al igual que manejo de llaves
    dependencies {
    implementation “androidx.security:security-crypto:1.0.0-rc02”
    }

    View Slide

  18. Encriptación en Android
    • Usando Tink, una librera cross-platform para encriptación, Esto
    significa que debemos usar un minSDK de 23

    View Slide

  19. Encriptación en Android
    • Mejores practicas, relacionadas a la escritura y lectura de data
    segura, al igual que manejo de llaves
    dependencies {
    implementation “androidx.security:security-crypto:1.1.0-alpha01”
    }

    View Slide

  20. Encriptación en Android

    View Slide

  21. KeyPairGenerator VS. Jetpack Security
    KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore").apply {
    val certBuilder = KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_ENCRYPT)
    .setKeyValidityStart(keyValidityStart)
    .setKeyValidityEnd(keyValidityEnd)
    .setCertificateSerialNumber(BigInteger.valueOf(1L))
    .setCertificateSubject(X500Principal("CN=MyCompany"))
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    initialize(
    certBuilder
    .setIsStrongBoxBacked(true)
    .build()
    )
    } else {
    initialize(certBuilder.build())
    }
    }.also {
    val keyPair = it.generateKeyPair()
    //Continue here
    }

    View Slide

  22. KeyPairGenerator VS. Jetpack Security
    val spec = KeyGenParameterSpec.Builder(
    KEY_NAME,
    KeyProperties.PURPOSE_ENCRYPT or
    KeyProperties.PURPOSE_DECRYPT
    ).apply {
    setBlockModes(KeyProperties.BLOCK_MODE_CBC)
    setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
    setUserAuthenticationRequired(true)
    setUserAuthenticationValidityDurationSeconds(TIMEOUT_SECONDS)
    setRandomizedEncryptionRequired(false)
    }.build()

    View Slide

  23. KeyPairGenerator VS. Jetpack Security
    Amigos, no enemigos

    View Slide

  24. Encriptación en Android
    MASTER KEY
    KEYSET
    File or
    SharedPreference
    Key to
    encrypt

    View Slide

  25. Encriptación en Android
    KEYCHAIN
    Key
    Key Alias

    View Slide

  26. Encriptación en Android
    //Out of the box, without magic tricks
    val masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)

    View Slide

  27. Encriptación en Android
    val spec = KeyGenParameterSpec.Builder(
    KEY_NAME,
    KeyProperties.PURPOSE_ENCRYPT or
    KeyProperties.PURPOSE_DECRYPT
    ).apply {
    setBlockModes(KeyProperties.BLOCK_MODE_CBC)
    setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
    setUserAuthenticationRequired(true)
    setUserAuthenticationValidityDurationSeconds(TIMEOUT_SECONDS)
    setRandomizedEncryptionRequired(false)
    }.build()

    View Slide

  28. Encriptación en Android
    //Out of the box, without magic tricks
    val masterKeyAlias = MasterKeys.getOrCreate(spec)

    View Slide

  29. Encriptación en
    Android: Vol 3

    View Slide

  30. Encriptación en Android
    val encryptedFile = EncryptedFile.Builder(
    File(directoryPath, "FileName"),
    context,
    masterKeyAlias,
    EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
    ).build()

    View Slide

  31. Encriptación en Android
    encryptedFile.openFileOutput().bufferedWriter().use {
    it.write("Hola Mexico! vamos a encriptar esto")
    }

    View Slide

  32. Encriptación en Android
    val contents = encryptedFile.bufferedReader().useLines { lines ->
    lines.fold("") { working, line ->
    "$working\n$line"
    }
    }

    View Slide

  33. Encriptación en Android
    val sharedPreferences = EncryptedSharedPreferences.create(
    "FileName",
    masterKeyAlias,
    context,
    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
    )
    val sharedPrefsEditor = sharedPreferences.edit()

    View Slide

  34. Encriptación en Android
    • Encriptando las keys y los values, por que a veces guardamos las
    cosas como:
    val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
    with (sharedPref.edit()) {
    putString("Llave del servidor de mi empresa", superUltraPrivateKey)
    commit()
    }

    View Slide

  35. Encriptación en Android
    •Encriptación de Keys y Values con diferentes métodos
    •Procesos más seguros

    View Slide

  36. Encriptación en Android
    • Support para Kit Kat
    •Rotation Keys
    •ALPHA, necesitamos un Release Candidate

    View Slide

  37. Encriptación en Android
    # Security
    -keepclassmembers class * extends com.google.crypto.tink.shaded.protobuf.GeneratedMessageLite {
    ;
    }

    View Slide

  38. Biometricos
    como auth local:
    Vol 4

    View Slide

  39. Encriptación en Android
    val spec = KeyGenParameterSpec.Builder(
    KEY_NAME,
    KeyProperties.PURPOSE_ENCRYPT or
    KeyProperties.PURPOSE_DECRYPT
    ).apply {
    setBlockModes(KeyProperties.BLOCK_MODE_CBC)
    setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
    setUserAuthenticationRequired(true)
    setUserAuthenticationValidityDurationSeconds(TIMEOUT_SECONDS)
    setRandomizedEncryptionRequired(false)
    }.build()

    View Slide

  40. Encriptación en Android
    • Necesitamos un método de autenticación para usar MasterKey por
    ejemplo, biometric prompt
    dependencies {
    implementation “androidx.biometric:biometric:1.0.0-alpha03"
    }

    View Slide

  41. Encriptación en Android
    val promptInfo = BiometricPrompt.PromptInfo
    .Builder().apply {
    setTitle(“Titulo bonito")
    setDescription(“Descripción bonita”)
    setDeviceCredentialAllowed(true)
    }.build()

    View Slide

  42. Encriptación en Android
    BiometricPrompt(
    this, //Nice Activity
    ContextCompat.getMainExecutor(this),
    ourNiceCoolCallback
    ).authenticate(promptInfo)

    View Slide

  43. Encriptación en Android
    BiometricPrompt(activity, executor, object : BiometricPrompt.AuthenticationCallback() {
    override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
    super.onAuthenticationError(errorCode, errString)
    }
    override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
    super.onAuthenticationSucceeded(result)
    }
    override fun onAuthenticationFailed() {
    super.onAuthenticationFailed()
    }
    })

    View Slide

  44. Native code
    Modules: Vol 5

    View Slide

  45. Modulos de código Nativo en Android
    • Modulos de C y C++

    View Slide

  46. Los modulos en C y C++ son seguros?
    Modulos de código Nativo en Android
    DEPENDE

    View Slide

  47. Encriptación en Módulos de Código Nativo
    #include

    JNIEXPORT jstring JNICALL
    Java_com_amazing_project_keymodule_NdkKeys_getSomeID(JNIEnv *env,jobject instance) {
    return (*env)->NewStringUTF(env,"SomeCoolStringThatYouWantToKeepSafe");

    View Slide

  48. Encriptación en Módulos de Código Nativo
    private const val AES_MODE = "AES/CBC/PKCS7Padding"
    private val CHARSET = Charsets.UTF_8
    private const val HASH_ALGORITHM = "SHA-256"
    private val ivBytes = byteArrayOf(
    0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00)
    @Throws(NoSuchAlgorithmException::class, UnsupportedEncodingException::class)
    private fun generateKey(password: String): SecretKeySpec {
    val digest = MessageDigest.getInstance(HASH_ALGORITHM)
    val bytes = password.toByteArray(charset("UTF-8"))
    digest.update(bytes, 0, bytes.size)
    val key = digest.digest()
    return SecretKeySpec(key, "AES")
    }

    View Slide

  49. Encriptación en Módulos de Código Nativo
    private const val AES_MODE = "AES/CBC/PKCS7Padding"
    private val CHARSET = Charsets.UTF_8
    private const val HASH_ALGORITHM = "SHA-256"
    private val ivBytes = byteArrayOf(
    0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00)
    @Throws(NoSuchAlgorithmException::class, UnsupportedEncodingException::class)
    private fun generateKey(password: String): SecretKeySpec {
    val digest = MessageDigest.getInstance(HASH_ALGORITHM)
    val bytes = password.toByteArray(charset("UTF-8"))
    digest.update(bytes, 0, bytes.size)
    val key = digest.digest()
    return SecretKeySpec(key, "AES")
    }

    View Slide

  50. Encriptación en Módulos de Código Nativo

    View Slide

  51. Android 11:
    Privacy changes!

    View Slide

  52. • La data es de nuestros usuarios
    • El futuro es hoy, Android 10 agrego cosas como Roles,
    Restriction de Content providers, Screen recording y Location
    Settings
    Android 11

    View Slide

  53. Permisos
    Android 10 Android 11
    Background and Foreground Only one time

    View Slide

  54. Location Permissions
    Android 11
    Background Location and Foreground Location

    View Slide

  55. Apps no longer used
    •Si tu Target SDK es Android 11, las apps que no sean usadas, se
    les removerá los permisos de manera automática
    •Se le informara al usuario

    View Slide

  56. Privacy es la prioridad numero 1.

    View Slide

  57. SEGURIDAD MODERNA
    PARA ANDROID

    DEVELOPERS
    Dinorah Tovar
    Platform Mobile Engineer
    @ddinorahtovar
    @ddinorahtovar
    @dinorahto
    @dinorahto
    Doing code @ Konfío

    View Slide