Segurança no estilo do Google



O Google I / O 2019 morreu e chegou a hora reescrever projetos em uma nova arquitetura aprender coisas novas. Como estou interessado na segurança de aplicativos móveis, chamei a atenção para a nova biblioteca da família JetPack - security-crypto . A biblioteca ajuda a organizar a criptografia de dados corretamente e, ao mesmo tempo, protege os desenvolvedores de todas as nuances que acompanham esse processo.


Antecedentes históricos


A criptografia de dados no Android sempre gerou muita discussão. Qual algoritmo escolher? Qual modo de criptografia usar? O que é preenchimento? Onde guardar as chaves? Aprender tudo isso e manter seu conhecimento atualizado pode ser difícil para o desenvolvedor médio. Portanto, a história costumava terminar em um dos três cenários:


  • copiar e colar da primeira solução com stackoverflow
  • procure um “manual adequado” com subsequente implementação e coleta de ancinhos
  • ativação do protocolo “E assim será!”

À medida que a comunidade de desenvolvedores do Android se desenvolvia, as bibliotecas começaram a aparecer para ajudar a resolver esse problema. A qualidade dessas soluções era muito diferente: de toda essa variedade, posso selecionar apenas java-aes-crypto , que usamos no Redmadrobot. Uma implementação de alta qualidade, mas houve alguns problemas com ela.


Primeiro de tudo, era apenas criptografia de cadeia. Isso por si só não é ruim, mas essas seqüências precisam ser armazenadas em algum lugar, no banco de dados ou em SharedPreferences. Portanto, você precisa escrever um wrapper sobre a fonte de dados para que tudo seja criptografado em tempo real (o que fizemos uma vez). Mas este é o código que precisa ser suportado, arrastado de um projeto para outro ou executado em uma biblioteca para facilitar o uso. Por fim, isso também foi feito, mas não trouxe conforto às mentes questionadoras.


Em segundo lugar, esta solução não oferece nada para resolver o problema de gerenciamento de chaves. Eles poderiam ser gerados, mas o armazenamento caiu completamente sobre os ombros do desenvolvedor. Com todos os agachamentos em torno da AndroidKeystore em diferentes versões do SO e dispositivos vindos da China continental.


Esta cidade precisa de um novo herói


Tudo correu normalmente até que, no verão de 2018, descobri que existe uma biblioteca tão maravilhosa do Google como a Tink . É muito fácil aprender e protege o desenvolvedor de um grande número de nuances relacionadas à criptografia. Usando esta biblioteca, é quase impossível fazer algo errado. Além disso, Tink assume o controle total das chaves e abstrai todas as operações com o AndroidKeystore do desenvolvedor.


Mas ainda era apenas criptografia de cadeia. E aqui as Preferências Binárias apareceram com muito sucesso - uma biblioteca de um fabricante nacional que eu queria examinar há muito tempo. Ele permite criptografar todos os dados armazenados de qualquer algoritmo - para isso, basta escrever uma implementação de duas interfaces, KeyEncryption e ValueEncryption (para chaves e valores, respectivamente).


Como resultado, começamos a usar essas duas bibliotecas em conjunto e ficamos felizes por nosso código ficar mais limpo e fácil de entender.


criptografia de segurança



Agora, o Google decidiu mais uma vez conhecer os desenvolvedores e simplificar suas vidas no campo da criptografia de dados armazenados. Outra biblioteca JetPack foi anunciada para ajudar com isso. Fiquei me perguntando o que eles escreveram tão revolucionário lá, e subi para procurar por documentação (spoiler: não é). Eu só encontrei javadoc nas classes incluídas na biblioteca, mas obrigado por isso também. Descobriu-se que existem poucas oportunidades: criptografia de arquivos, Preferências compartilhadas e trabalho com chaves.


Para testar a funcionalidade da biblioteca, escrevi alguns trechos:


Criptografia de arquivo
val file = File(filesDir, "super_secure_file") val encryptedFile = EncryptedFile.Builder(file, this, "my_secret_key", EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB) .setKeysetAlias("my_test_keyset_alias") .setKeysetPrefName("keyset_pref_file") .build() val outputStream = encryptedFile.openFileOutput() outputStream.use { it.write("secret info".toByteArray()) } 

Criptografia SharedPreferences
 val encryptedPreferences = EncryptedSharedPreferences.create( "super_secret_preferences", "prefrences_master_key", this, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) encryptedPreferences.edit().putString("secret", "super secret token") 

Para minha grande surpresa, tudo funcionou da primeira vez e pude ver o código que eles escreveram para esta biblioteca. Tendo caído na fonte, vi que esse é realmente um invólucro em torno da biblioteca Tink que já conhecemos, e o código escrito é quase um por um, como escrevemos para as BinaryPreferences criptografadas.


Fiquei muito satisfeito com o fato de o Google desta vez não começar a inventar um ciclomotor, mas usar suas próprias práticas bem estabelecidas. Vamos esperar que o pacote de security que veio ao JetPack não seja limitado apenas a esta biblioteca, mas que se desenvolva ainda mais.


Demonstração do pacote BinaryPreferences + Tink
Código-fonte da biblioteca de criptografia de segurança
Demonstração de criptografia de segurança

Source: https://habr.com/ru/post/pt452252/


All Articles