Escondendo chaves privadas em Flutter

Como manter seu repositório livre de dados privados

Matheus de Vasconcelos
Apr 28 · 5 min read
Photo by Jason Dent on Unsplash

Proteção de dados

Cada vez mais se fala em proteção de dados, desde os pessoais, como o CPF de uma pessoa física, até dados internos de empresas, como contratos.
No desenvolvimento de software esta preocupação também existe e muitas vezes é trabalho do desenvolvedor garantir que dados como APIKeys não fiquem expostos em repositórios, por exemplo.

Variáveis de ambiente

Uma das formas de garantir que nenhuma chave privada seja exposta no seu repositório é utilizar variáveis de ambiente. Elas funcionam como variáveis de código, mas, ao invés de serem declaradas e inicializadas no código, ficam no seu ambiente (computador).

No Flutter é possível criar esta variável de ambiente ao utilizar a flag --dart-define nos comandos de terminal do Flutter. Assim, para criar uma variável de ambiente chamada EMPRESA com o valor concrete, por exemplo, basta utilizar o seguinte comando:

flutter run --dart-define=EMPRESA=concrete

Com a variável criada pelo comando, é possível recuperá-la no código e para isso utilizamos o método fromEnvironment de acordo com o tipo de dado passado na criação dela. No caso do exemplo acima o valor é um texto, portanto utilizamos o método a partir do tipo String.

String myCompany = String.fromEnvironment('EMPRESA');

Utilizando essa estrutura é possível passar qualquer informação sensível por meio de variáveis de ambiente.

Integrando com as IDEs

Como o Flutter não possui uma IDE própria, o desenvolvimento precisa ser feito em outras IDEs ou editores de texto. Os mais utilizados são o VSCode (editor de texto desenvolvido pela Microsoft) e o Android Studio (IDE para desenvolvimento de aplicações Android).

Para utilizar o comando de terminal do Flutter em conjunto com a flag de variável de ambiente é preciso realizar modificações tanto para o VSCode quanto para o Android Studio.

Para o VSCode é preciso adicionar uma launch configuration para executar o projeto com a flag. Uma launch configuration é um arquivo em que se pode definir alguns detalhes de como a aplicação vai ser executada.

Com o projeto Flutter aberto no VSCode, é possível adicionar uma launch configuration ao ir na aba “Run and Debug”, clicando em “create a launch.json file” e por fim selecionando a opção “Dart & Flutter”.

Após essa ação, uma nova pasta será criada na raiz do projeto com o nome “.vscode” e, dentro dela, teremos um arquivo chamado “launch.json”.

O arquivo “launch.json” criado traz uma configuração simples que vai executar o main.dart do projeto. No entanto, para que a configuração passe as variáveis de ambiente para o comando de terminal, é preciso definir a propriedade “args” do JSON. Essa propriedade é uma lista em que se pode definir as flags passadas ao comando de terminal.

É importante ressaltar que ao utilizar uma launch configuration para executar o projeto, é preciso clicar na aba “Run and Debug” e, em seguida, no botão de play com o nome da configuração.

Com isso, é possível recuperar as informações sensíveis pelo código. No entanto, elas ainda serão adicionadas ao repositório.

Para garantir que seu repositório fique livre dessas chaves privadas é preciso adicionar a pasta “.vscode” ao .gitignore do projeto. Assim, basta garantir que os desenvolvedores tenham acesso aos arquivos dessa pasta de uma forma mais segura e em compliance para a empresa.

Para o Android Studio, por sua vez, é preciso mudar a configuração principal. Para isso, clique na configuração.

Após selecionar a configuração clique em “Edit Configurations…”.

Uma nova janela vai abrir com a configuração. Nela, basta preencher o campo “Additional arguments” com seus dados privados.

Dessa maneira, o projeto está configurado e basta executá-lo normalmente. No entanto, essa configuração ainda será enviada para o repositório.

Para evitar que o repositório receba esses dados sensíveis, basta adicionar a pasta “.idea” ao .gitignore do projeto e garantir que os desenvolvedores tenham acesso aos arquivos dessa pasta de uma forma mais segura e em compliance para a empresa.

CI

Um conceito de extrema importância no desenvolvimento é o Continuous Integration (CI), no qual uma das premissas é garantir que o código que está sendo mesclado na branch principal esteja funcionando.

Muitas vezes esse processo é feito de maneira automatizada, mas com as configurações feitas no projeto, é preciso garantir que a máquina que executa o processo de build e test saiba como executá-lo utilizando as variáveis de ambiente.

Para que isso aconteça, basta utilizar o comando de terminal do Flutter com as chaves privadas, sempre garantindo que a máquina que executa esse processo mantenha essas informações protegidas. Por exemplo, caso esteja utilizando o Github, é possível utilizar os secrets que, por padrão, mantêm suas chaves privadas criptografadas e podem ser utilizados inclusive no Github Actions.

Conclusão

Utilizando os arquivos de configuração das IDEs e o conceito de variáveis de ambiente no Flutter, conseguimos garantir que o repositório fique livre de dados privados como chaves de APIs e outras informações sensíveis.
Dessa maneira, é possível manter essas informações em locais mais apropriados que sigam as regras de segurança e de compliance da empresa.

Tem alguma dúvida ou algo para contribuir? Aproveite os campos de comentários. E se você quiser fazer parte de um time que aprende muito o tempo todo é só dar uma olhada aqui e se candidatar a alguma de nossas vagas. Vamos aprender juntos!

Concrete

Nós desenvolvemos produtos digitais com inovação, agilidade…

Concrete

Nós desenvolvemos produtos digitais com inovação, agilidade e excelentes práticas, para que o mercado brasileiro e latino-americano acompanhe a velocidade do mercado digital mundial.

Matheus de Vasconcelos

Written by

iOS Developer — Apple Developer Academy Alumni | Mackenzie. Studying Unit Tests.

Concrete

Nós desenvolvemos produtos digitais com inovação, agilidade e excelentes práticas, para que o mercado brasileiro e latino-americano acompanhe a velocidade do mercado digital mundial.

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store