Slide 1

Slide 1 text

SEGURIDAD MODERNA PARA ANDROID
 DEVELOPERS Dinorah Tovar Platform Mobile Engineer @ddinorahtovar @ddinorahtovar @dinorahto @dinorahto Doing code @ Konfío

Slide 2

Slide 2 text

Hablemos sobre seguridad

Slide 3

Slide 3 text

• 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

Slide 4

Slide 4 text

En Android 10 Privacidad Actualizaciones Endurecimiento

Slide 5

Slide 5 text

Encriptación en Android: Vol 1

Slide 6

Slide 6 text

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”

Slide 7

Slide 7 text

Encriptación en Android 
 Algorithm Data Key Cipher Text

Slide 8

Slide 8 text

Encriptación en Android Cipher Mac Signature Message Digest

Slide 9

Slide 9 text

Encriptación en Android

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Encriptación en Android •Hardware acceleration •Android Version

Slide 14

Slide 14 text

Encriptación en Android: Vol 2

Slide 15

Slide 15 text

Encriptación en Android

Slide 16

Slide 16 text

Encriptación en Android

Slide 17

Slide 17 text

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” }

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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” }

Slide 20

Slide 20 text

Encriptación en Android

Slide 21

Slide 21 text

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 }

Slide 22

Slide 22 text

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()

Slide 23

Slide 23 text

KeyPairGenerator VS. Jetpack Security Amigos, no enemigos

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

Encriptación en Android KEYCHAIN Key Key Alias

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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()

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

Encriptación en Android: Vol 3

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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() }

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

Biometricos como auth local: Vol 4

Slide 39

Slide 39 text

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()

Slide 40

Slide 40 text

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" }

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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() } })

Slide 44

Slide 44 text

Native code Modules: Vol 5

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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");

Slide 48

Slide 48 text

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") }

Slide 49

Slide 49 text

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") }

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

Android 11: Privacy changes!

Slide 52

Slide 52 text

• 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

Slide 53

Slide 53 text

Permisos Android 10 Android 11 Background and Foreground Only one time

Slide 54

Slide 54 text

Location Permissions Android 11 Background Location and Foreground Location

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

Privacy es la prioridad numero 1.

Slide 57

Slide 57 text

SEGURIDAD MODERNA PARA ANDROID
 DEVELOPERS Dinorah Tovar Platform Mobile Engineer @ddinorahtovar @ddinorahtovar @dinorahto @dinorahto Doing code @ Konfío