Um “cofre” para passwords simples e de baixo custo

Introdução

Um dos mais comuns e mais falados problemas de segurança de um sistema de informação são as passwords sem “qualidade” muitas vezes motivadas pela dificuldade de memorização das mesmas.

De forma a enquadrar o leitor, cada password deve ter um comprimento adequado e preferencialmente não ser previsível. Por exemplo, uma password como 1979aMelhorGeracaoDeSempre! (27 caracteres), é previsível se considerarmos que o utilizador nasceu em 1979 e possivelmente falará imenso desse facto gabando a sua geração. Neste caso, apesar de ser fácil de memorizar, é relativamente simples de “adivinhar”, ou melhor deduzir, por parte de alguém que pretenda obter acesso ao sistema no qual o utilizador em causa usa esta password.

Por outro lado, passwords com qualidade como: zb8@g-DMK&7@%pRyhE45DhbbPs$!angSRhHNUenBpu4AZ4+$KLA-gcJFYfdwV=yN$RXw6TmD-YTpBf9?dWRkRAXu35XhwE=d*!vt53-m8dq34fmr?cCAv#k#u*gsSdgg (128 caracteres), apesar de serem praticamente impossíveis de deduzir, são demasiado complexas para serem memorizadas, tornando o seu uso difícil e praticamente inviável.

Quanto mais complexa for uma password, mais complexa será a sua memorização e mais tendenciosa será. Por exemplo contrariamente à anteriormente apresentada que tem 128 caracteres, uma password grande em tamanho, definida por um método que não seja pseudo-aleatório, para memorização tenderá a ser um conjunto de caracteres segundo por exemplo uma cifra César.

Deve sempre existir uma razoabilidade entre o tamanho das passwords e aquilo que elas protegem. Os exemplos dados, são simplesmente para ilustrar a questão da dificuldade de memorizar passwords.

Existem diversos projectos que tentam resolver este problema; entre eles, um dos que me parece mais interessante e que recentemente se tornou comercialmente disponível, o Mooltipass, é baseado em Arduino. Este projecto, tem diversas funcionalidades sendo a sua segurança elevada, na minha opinião, perde um pouco pelo elevado custo.

Com base no conceito de “cofre de passwords” e com a ideia de que o factor custo pode em muitos casos ser um problema, pensei em fazer o meu próprio XXVB“cofre de passwords”, de baixo custo, que se comportasse como um teclado e fosse capaz de digitar qualquer uma das minhas passwords, sem que eu tivesse de as digitar manualmente nem das saber de cabeça! Passemos então, caro leitor, à prática…

Hardware

Existem centenas de microcontroladores disponíveis no mercado, uns mais caros, outros mais baratos, para todos os gostos e propósitos. Neste caso, usei e, recomendo o uso dos microcontroladores baseados em ATMega U32, como o caso do Arduino Leonardo, Yun, etc… Esta escolha prende-se principalmente pelo suporte USB de que dispõem, permitindo que sejam tratados pelo sistema operativo como um teclado USB.

Neste caso usei um Arduino Leonardo R3, baseado no Microcontrolador ATmega32u4, com 20 pinos digitais de input/output, 7 canais PWM, 32KB de memória Flash (dos quais apenas 28 estão disponíveis, pois 4 são usados pelo bootloader), 2.5KB de SRAM, 1KB de EEPROM, e um peso relativamente baixo de 20g (o circuito completo pesará cerca de 70g).

Depois de alguma pesquisa e tendo em conta que era desejável um circuito de pequenas dimensões, baixo custo e uma interface de utilizador simples de usar, optei por adicionar ao Arduino, um LCD Keypad Shield, simples com 2 linhas por 16 colunas, 6 teclas, com 8 caracteres programáveis pelo utilizador, de forma a ser possível “digitar” uma password e interagir com o dispositivo.

Programa

Escolhidos os componentes de hardware, o circuito é relativamente fácil de programar em C++, usando ou o ambiente de desenvolvimento do Arduino, ou outro, como o Visual Studio. Optei por fazer a reprogramação na linha de comandos usando um editor de texto (no meu caso o nano), e usando o platformio, para compilar e fazer upload do programa via interface de linha de comandos (CLI).

Como as passwords serão armazenadas na memória flash do Arduino e considerando que estas devem ser mudadas com regularidade, o que implica compilar novamente o sketch do Arduino e fazer o respectivo upload, o platformio é uma opção bastante boa para estas tarefas, sendo de instalação e utilização simples, cross-platform. Acima de tudo, é eficaz.

Instalação do Platformio

Para instalar o platformio deve-se ter instalado o Python 2.7, (atenção que não é compatível com as versões 3.x).

Em GNU/Linux e Mac OS X, a instalação segue os seguintes passos:

python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)"
cd /path/get-platformio.py/script
python get-platformio.py
pip install https://github.com/platformio/platformio/archive/develop.zip
pip install platformio && pip install --egg scons
pip install -U platformio
pip install https://github.com/platformio/platformio/archive/develop.zip

Em Windows a instalação segue passos ligeiramente diferentes:

python.exe get-platformio.py
pip search platformio
pip install platformio && pip install --egg scons
pip install -U platformio
pip install https://github.com/platformio/platformio/archive/develop.zip

Uma vez instalado o platfromio, será necessário instalar a plataforma atmelavr. Neste caso os passos são os mesmos quer se esteja a usar Windows, GNU/Linux ou MacOS X.

platformio install atmelavr
cd directorioDoProjecto
platformio init

Dentro desta directoria estará um ficheiro chamado platformio.ini, que devemos editar e colocar com as configurações correctas, de placa de desenvolvimento, plataforma, framework e porta.

#
# Project Configuration File
#
# A detailed documentation with the EXAMPLES is located here:
# http://docs.platformio.org/en/latest/projectconf.html
#
# A sign `#` at the beginning of the line indicates a comment
# Comment lines are ignored.
# Simple and base environment
[env:mybaseenv]
platform = atmelavr
framework = arduino
board = leonardo
upload_port = COM10
#
# Automatic targets - enable auto-uploading
targets = upload

No meu caso a porta correcta foi a COM10. Convém verificar qual a porta que está a ser utilizada pelo Arduino.

Para compilar e fazer o upload do sketch para o Arduino, utilizando o platformio, via CLI, basta digitar o comando:

platformio run --target upload

Voltemos ao desenvolvimento da nossa aplicação, que irá armazenar as passwords e “digitá-las” quando precisarmos.

Tal como escrevi no início do artigo, normalmente temos mais do que uma password diferente e essa será, de facto, a política mais segura. Uma vez que as passwords serão armazenadas num “cofre”, será necessária uma só senha para acedermos a todas as senhas guardadas nele. No entanto precisamos de aceder a cada senha especificamente, para não inserirmos senhas trocadas, bem como para escolhermos que senha digitar. Para tal precisamos de um interface que nos permita escolher a senha. Neste caso será o LCD a mostrar a senha e o keypad vai permitir-nos escolher a senha.

Publicado na edição 50 (PDF) da Revista PROGRAMAR.