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
  2. • 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
  3. 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”
  4. 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
  5. 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"/>
  6. 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” }
  7. Encriptación en Android • Usando Tink, una librera cross-platform para

    encriptación, Esto significa que debemos usar un minSDK de 23
  8. 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” }
  9. 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 }
  10. 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()
  11. Encriptación en Android //Out of the box, without magic tricks

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

    val masterKeyAlias = MasterKeys.getOrCreate(spec)
  14. Encriptación en Android val encryptedFile = EncryptedFile.Builder( File(directoryPath, "FileName"), context,

    masterKeyAlias, EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB ).build()
  15. Encriptación en Android val sharedPreferences = EncryptedSharedPreferences.create( "FileName", masterKeyAlias, context,

    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) val sharedPrefsEditor = sharedPreferences.edit()
  16. 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() }
  17. Encriptación en Android • Support para Kit Kat •Rotation Keys

    •ALPHA, necesitamos un Release Candidate
  18. 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()
  19. 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" }
  20. Encriptación en Android val promptInfo = BiometricPrompt.PromptInfo .Builder().apply { setTitle(“Titulo

    bonito") setDescription(“Descripción bonita”) setDeviceCredentialAllowed(true) }.build()
  21. 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() } })
  22. Los modulos en C y C++ son seguros? Modulos de

    código Nativo en Android DEPENDE
  23. 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");
  24. 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") }
  25. 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") }
  26. • 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
  27. 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
  28. SEGURIDAD MODERNA PARA ANDROID
 DEVELOPERS Dinorah Tovar Platform Mobile Engineer

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