Como desenvolver seu próprio gerador de senha no iOS

Victor Catão
5 min readMar 10, 2022

--

Photo by NeONBRAND on Unsplash

Você deve saber que não é seguro ter a mesma senha pra tudo, né?

Bom, eu também sempre soube disso mas sempre ignorei o risco, até que em um momento em 2019 recebi um aviso que algum site que eu usava havia sido atacado, vazando a minha senha e, portanto, não era mais seguro utilizá-la. Sendo assim, pensei que poderia desenvolver um algoritmo pessoal para gerar minhas senhas de acordo com o serviço ou site.

Como um bom preguiçoso, pensei: “Eu não vou ficar calculando mentalmente minha senha toda hora, né?”. Foi assim que criei um aplicativo para uso pessoal que gerasse uma senha diferente para cada serviço.

Como gostei do resultado, resolvi compartilhar aqui com vocês.

O algoritmo criado pra esse artigo é diferente do que eu uso no meu dia a dia e você pode brincar criando a própria lógica pra geração da senha. O algoritmo que criei para esse artigo gera uma senha baseada nessa estrutura:

[random number][caesar cipher capitalizing first letter][special character][random number]

Essa estrutura foi criada pensando na maioria dos sites, que normalmente pedem para você criar uma senha que contenha:

  • Números
  • Letras maiúsculas
  • Letras minúsculas
  • Carácter especial

Você pode adicionar algo se quiser. Verá como é fácil até o final do artigo. Siga-me os bons!

Algoritmos de criptografia

Antes de mais nada acho interessante explicar o que significa “criptografia”. A palavra vem do grego kyptós (secreta) + graphein (escrita). De forma sucinta, é a conversão de uma mensagem legível para outra mensagem que, aparentemente, não faz sentido algum. Por exemplo:

HELLO WORLD = KHOOR ZRUOG

No caso acima foi utilizada a Cifra de César para codificar a mensagem, utilizando 3 de shift (deslocamento). Ficou muito vago? Calma, eu imaginei isso. No próximo capítulo vou explicar tudo. Porém, antes de explicar esse algoritmo, gostaria que soubesse que existem diversos outras técnicas que você poderia utilizar para fazer o seu próprio algoritmo de gerador de senha. Alguns deles são:

  • Cifras de Substituição Simples
  • Cifras de Substituição Monoalfabética
  • Cifra de Vigenère
  • Cifras de Transposição
  • Cifra AutoKey
  • Cifra Vernam

Cifra de César

Diferente da Caesar Salad, a Caesar Cipher (Cifra de César) tem esse nome pois era muito utilizada pelo imperador Júlio César. É uma das técnicas mais clássicas de criptografia e utiliza-se da estratégia de substituição. Nela, cada letra é substituída por outra letra específica, de modo a criar uma espécie de “máscara” da mensagem.

A técnica tradicional é utilizada com um shift do alfabeto de 3 letras. Dessa forma, cada letra do alfabeto possui a sua correspondente no alfabeto criptografado. Assim, basta substituir a letra “original” pela sua correspondência.

Cifra de César com shift 3.

Agora fica mais fácil acreditar que HELLO WORLD = KHOOR ZRUOG, né? Veja:

Como eu disse, a técnica tradicional utiliza um shift de 3 letras, mas podemos utilizar qualquer número. No algoritmo que vou abordar nesse artigo você vai ver que utilizei um shift dinâmico. Sem mais delongas, vamos ao que interessa.

Projeto

Para iniciar o projeto, basta baixá-lo aqui. É importante ressaltar que não é um projeto com uma arquitetura robusta, pois está longe de ser o foco deste artigo. Para simplificar o projeto, deixei tudo em MVC e Storyboard mesmo.

Para este artigo você só vai precisar olhar para duas classes:

  • MainViewController: A única ViewController da aplicação, a qual possui todos as views e ações. Nela você encontrará a flag shouldUseBiometricAuthentication que controla se você quer ativar a autenticação biométrica ou não (altamente recomendável para o caso de instalar o app no seu celular). Além disso, possui a lógica da ação principal do app: encriptar o input do usuário utilizando a classe Encrypter.
  • Encrypter: Um Singleton que é classe mais importante do projeto, que é onde está toda a lógica de geração da senha. Para ela nós temos um capítulo exclusivo à seguir.

Encrypter

A classe possui apenas um método público, responsável por encriptar o texto do input do usuário. Dado o texto “Facebook”, esse método retorna a senha gerada “56Jwws(104”. Ok, mas como?

Antes de começar é importante relembrar a estrutura da encriptação:

[random number][caesar cipher capitalizing first letter][special character][random number]

Para calcular o primeiro e último número, o algoritmo multiplica um número primo qualquer que está definido na classe pelo tamanho do texto passado no argumento (Facebook = 8 caracteres). Assim:

  • initialNumber = 8 * 7 = 56
  • finalNumber = 8 * 13 = 104

Vualá! Agora nossa string criptografada está assim:

56[caesar cipher][special character]104

Depois disso, o algoritmo calcula a Cifra de César com os últimos 4 (constante maximumCipherSize) dígitos do input do usuário: book.

Para que seja algo dinâmico, o shift definido foi o tamanho do input. Ou seja, calculamos a Cifra de César para “book” com um shift de 8. A string a ser utilizada no resultado final será o retorno dessa função, com a primeira letra maiúscula.

caesarCipher(book, 8) = jwws => .capitalizingFirstLetter = Jwws

Agora nosso resultado está quase completo. Já temos praticamente toda a string de retorno:

56Jwws[special character]104

Bom, agora só falta o carácter especial. Para calculá-lo a nossa classe tem um array pré-definido com alguns caracteres especiais (specialCharacteres).

O algoritmo pegará um carácter em uma posição específica da lista, que é a constante index calculada com o resto da divisão do tamanho do input pelo tamanho do array, evitando que tente acessar uma posição inexistente no array.

index = textSize % specialCharacteresSize = 8 % 10 = 8
specialCharacteres[8] = (

Finalmente nós temos a nossa string de retorno:

[random number][caesar cipher][special character][random number]
[56][Jwws][(][104]
56Jwws(104

Agora é com você

Fácil e útil, né? A ideia deste artigo é mais servir como uma inspiração para que construa o próprio algoritmo gerador de senha. Você pode altera as constantes da classe Encrypter para algo diferente, além de usar a imaginação na hora de brincar com as strings, números e caracteres especiais.

Até a próxima!

--

--

Victor Catão

Sr. iOS Developer at Uber, traveler, passionate about technology 🇧🇷