Pro Yearly is on sale from $80 to $50! »

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

C6e1201f51c1ff186edba69f98476f15?s=128

Dinorah Tovar

June 30, 2020
Tweet

Transcript

  1. SEGURIDAD MODERNA PARA ANDROID
 DEVELOPERS Dinorah Tovar Platform Mobile Engineer

    @ddinorahtovar @ddinorahtovar @dinorahto @dinorahto Doing code @ Konfío
  2. Hablemos sobre seguridad

  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
  4. En Android 10 Privacidad Actualizaciones Endurecimiento

  5. Encriptación en Android: Vol 1

  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”
  7. Encriptación en Android 
 Algorithm Data Key Cipher Text

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

  9. Encriptación en Android

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

  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
  12. La encriptación es un proceso de hardware o de software?

    Encriptación en Android DEPENDE
  13. Encriptación en Android •Hardware acceleration •Android Version <application android:name=".YourApp" android:icon="@mipmap/ic_launcher"

    android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:hardwareAccelerated="true"/>
  14. Encriptación en Android: Vol 2

  15. Encriptación en Android

  16. Encriptación en Android

  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” }
  18. Encriptación en Android • Usando Tink, una librera cross-platform para

    encriptación, Esto significa que debemos usar un minSDK de 23
  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” }
  20. Encriptación en Android

  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 }
  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()
  23. KeyPairGenerator VS. Jetpack Security Amigos, no enemigos

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

    to encrypt
  25. Encriptación en Android KEYCHAIN Key Key Alias

  26. Encriptación en Android //Out of the box, without magic tricks

    val masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)
  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()
  28. Encriptación en Android //Out of the box, without magic tricks

    val masterKeyAlias = MasterKeys.getOrCreate(spec)
  29. Encriptación en Android: Vol 3

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

    masterKeyAlias, EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB ).build()
  31. Encriptación en Android encryptedFile.openFileOutput().bufferedWriter().use { it.write("Hola Mexico! vamos a encriptar

    esto") }
  32. Encriptación en Android val contents = encryptedFile.bufferedReader().useLines { lines ->

    lines.fold("") { working, line -> "$working\n$line" } }
  33. Encriptación en Android val sharedPreferences = EncryptedSharedPreferences.create( "FileName", masterKeyAlias, context,

    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) val sharedPrefsEditor = sharedPreferences.edit()
  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() }
  35. Encriptación en Android •Encriptación de Keys y Values con diferentes

    métodos •Procesos más seguros
  36. Encriptación en Android • Support para Kit Kat •Rotation Keys

    •ALPHA, necesitamos un Release Candidate
  37. Encriptación en Android # Security -keepclassmembers class * extends com.google.crypto.tink.shaded.protobuf.GeneratedMessageLite

    { <fields>; }
  38. Biometricos como auth local: Vol 4

  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()
  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" }
  41. Encriptación en Android val promptInfo = BiometricPrompt.PromptInfo .Builder().apply { setTitle(“Titulo

    bonito") setDescription(“Descripción bonita”) setDeviceCredentialAllowed(true) }.build()
  42. Encriptación en Android BiometricPrompt( this, //Nice Activity ContextCompat.getMainExecutor(this), ourNiceCoolCallback ).authenticate(promptInfo)

  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() } })
  44. Native code Modules: Vol 5

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

    y C++
  46. Los modulos en C y C++ son seguros? Modulos de

    código Nativo en Android DEPENDE
  47. Encriptación en Módulos de Código Nativo #include <jni.h> 
 JNIEXPORT

    jstring JNICALL Java_com_amazing_project_keymodule_NdkKeys_getSomeID(JNIEnv *env,jobject instance) { return (*env)->NewStringUTF(env,"SomeCoolStringThatYouWantToKeepSafe");
  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") }
  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") }
  50. Encriptación en Módulos de Código Nativo

  51. Android 11: Privacy changes!

  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
  53. Permisos Android 10 Android 11 Background and Foreground Only one

    time
  54. Location Permissions Android 11 Background Location and Foreground Location

  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
  56. Privacy es la prioridad numero 1.

  57. SEGURIDAD MODERNA PARA ANDROID
 DEVELOPERS Dinorah Tovar Platform Mobile Engineer

    @ddinorahtovar @ddinorahtovar @dinorahto @dinorahto Doing code @ Konfío