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

Seguridad y encriptación: En el mundo de Android

Seguridad y encriptación: En el mundo de Android

C6e1201f51c1ff186edba69f98476f15?s=128

Dinorah Tovar

January 31, 2020
Tweet

Transcript

  1. Seguridad y encriptación En el mundo de Android Dinorah Tovar

    Lead Mobile Engineer @ddinorahtovar @ddinorahtovar @dinorahto @dinorahto Doing code @ Konfio
  2. Hablemos sobre seguridad

  3. Seguridad en Android • 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 y Endurecimiento
  4. En Android 10 Privacidad Actualizaciones Endurecimiento

  5. Encriptación y Android Es el proceso de codificación de la

    información de un usuario en un dispositivo Android, usando llaves simétricas
  6. Encriptación y Android 
 Algorithm Data Key Cipher Data

  7. Llaves, paddings, modos…? •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
  8. Llaves simétricas, publicas, privadas…

  9. Llaves simétricas, publicas, privadas… val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") Algorithm Model

    Padding
  10. Pero mi data esta encriptada? •La respuesta es: DEPENDE

  11. Pero mi data esta encriptada? •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"/>
  12. Resolvamos el problema

  13. Encriptación

  14. Encriptación

  15. Jetpack Security • 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-beta01" }
  16. Jetpack Security • 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-beta01" }
  17. Jetpack Security

  18. Jetpack Security

  19. Jetpack Security • Usando Tink, una librera cross-platform para encriptación,

    Esto significa que debemos usar un minSDK de 23
  20. Key Management

  21. Key Management 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()
  22. Key Management 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. MASTER KEY KEYSET Key Management File or SharedPreference Key to

    encrypt
  24. KEYCHAIN Key Management Key Key Alias

  25. Key Management //Out of the box, without magic tricks val

    masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)
  26. Key Management 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()
  27. Key Management //Out of the box, without magic tricks val

    masterKeyAlias = MasterKeys.getOrCreate(spec)
  28. Biometric Prompt

  29. Biometric Prompt • Necesitamos un método de autenticación para usar

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

    MasterKey por ejemplo, biometric prompt dependencies { implementation “androidx.biometric:biometric:1.0.0-alpha03" }
  31. Biometric Prompt val promptInfo = BiometricPrompt.PromptInfo .Builder().apply { setTitle(“Titulo bonito")

    setDescription(“Descripción bonita”) setDeviceCredentialAllowed(true) }.build()
  32. Biometric Prompt BiometricPrompt( this, //Nice Activity ContextCompat.getMainExecutor(this), ourNiceCoolCallback ).authenticate(promptInfo)

  33. Biometric Prompt 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() } })
  34. Encrypted files

  35. Archivos encriptados val encryptedFile = EncryptedFile.Builder( File(directoryPath, "FileName"), context, masterKeyAlias,

    EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB ).build()
  36. Escritura de archivos encriptados encryptedFile.openFileOutput().bufferedWriter().use { it.write("Hola Mexico! vamos a

    encriptar esto") }
  37. Lectura de archivos encriptados val contents = encryptedFile.bufferedReader().useLines { lines

    -> lines.fold("") { working, line -> "$working\n$line" } }
  38. Encrypted Shared Preferences

  39. Shared-preferences encriptados val sharedPreferences = EncryptedSharedPreferences.create( "FileName", masterKeyAlias, context, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,

    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) val sharedPrefsEditor = sharedPreferences.edit()
  40. Shared-preferences encriptados • 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() }
  41. Shared-preferences encriptados •Encriptación de Keys y Values con diferentes métodos

    •Procesos más seguros
  42. En camino al futuro • Support para Kit Kat •Rotation

    Keys •ALPHA, necesitamos un Release Candidate
  43. En camino al futuro

  44. Seguridad y encriptación En el mundo de Android Dinorah Tovar

    Mobile Engineer @ddinorahtovar @ddinorahtovar @dinorahto @dinorahto Doing code @ Konfio