Suporte a Curvas Elípticas (ECC)¶
Compatible Nitrokeys |
|||||||
|---|---|---|---|---|---|---|---|
✓ active |
⨯ inactive |
✓ active |
✓ active |
⨯ inactive |
✓ active |
⨯ inactive |
⨯ inactive |
RSA-2048 Torna-se cada vez mais inseguro¶
Por razões de segurança, o Bundesamt für Sicherheit in der Informationstechnik (BSI) já não recomenda chaves RSA com um comprimento de 2048 bit ` para serem usadas depois de 2023 <https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/TechGuidelines/TG02102/BSI-TR-02102-1.pdf>`__. Isto significa que as chaves mais longas terão de entrar em uso num futuro previsível. Assumindo um período de utilização de cinco anos, já é necessário para gerar chaves mais longas. No entanto, chaves RSA mais longas com 3072 bit ou 4096 bit são significativamente mais lentas. Por este motivo, o novo Nitrokey Storage 2 e Pro 2 (resp. o OpenPGP Card versão 3.3 integrado) suporta encriptação por meio de ` criptografia de curva celíaca (ECC) <https://en.wikipedia.org/wiki/Elliptic-curve_cryptography>`__. Este método é considerado tão seguro com chaves ECC mais pequenas como com chaves RSA mais longas e é também consideravelmente mais rápido.
Noções básicas de Criptografia Elíptica-Curva¶
Em contraste com a RSA, existem muitas formas diferentes (as chamadas curvas) de criptografia elíptica-curva. Notavelmente, o NSA esteve envolvido no desenvolvimento das curvas NIST. Mesmo que não haja evidência de portas traseiras nas curvas, a utilização de uma determinada curva pode colocar uma questão de confiança. Felizmente, o novo Nitrokey Storage 2 e Pro 2 suportam dois tipos de curvas, nomeadamente NIST e Brainpool. No que se segue, utilizaremos as curvas Brainpool. ` Este artigo <https://arstechnica.com/information-technology/2013/10/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/>`__ proporciona um bom ponto de entrada para a obtenção de uma compreensão geral da criptografia elíptica-curva.
Requisitos de sistema¶
Para criar chaves baseadas em curvas elípticas é necessário um Nitrokey Storage 2 / Pro 2 e GnuPG versão 2.1.17 ou superior.
Pode ler a versão OpenPGP Card da Nitrokey através de gpg2 --card-status`:
> gpg2 --card-status
Reader ...........: 20A0:...
Application ID ...: D276...
Version ..........: 3.3
...
O campo “Versão” representa a versão da placa OpenPGP integrada na Nitrokey - neste caso é a 3.3 conforme necessário para a criptografia de curva elíptica. A versão 2.2 do OpenPGP Card não suporta o ECC.
Pode conhecer a versão instalada do GnuPG através de gpg2 --version`. Pelo menos a versão 2.1.16 é necessária. A mais recente versão GnuPG para Windows pode ser encontrada aqui e a mais recente versão para MacOS pode ser encontrada aqui. Uma versão adequada do GnuPG está incluída nas distribuições GNU/Linux Ubuntu (desde 18.04), Debian (a partir de Stretch), Arch Linux, Fedora (a partir da versão 26) e openSUSE Tumbleweed. No final destes artigos encontram-se instruções de como actualizar manualmente o GnuPG em versões antigas do Ubuntu.
Importante
O GnuPG 2.0 ainda está sendo usado, mas o suporte para ele foi descontinuado em 2017. Todos os parceiros de comunicação devem usar o GnuPG 2.1 ou mais recente para criptografia de e-mail por meio do ECC, caso contrário, podem surgir problemas de incompatibilidade. Portanto, você só deve usar o ECC se você tiver certeza de que será capaz de contornar este problema.
Geração de Chaves no Armazenamento Nitrokey 2 / Pro 2¶
Once these requirements are fulfilled, you can get started. (Warning: existing keys will be overwritten in the process!) You now have two options. The first option is to create the key directly on the Nitrokey Storage 2 / Pro 2. The benefit here is that the key will never be outside the device and as such can never be read out. The second option is to import a previously locally generated key. The advantage in this case is that you can securely store a backup of the key, which can then be restored in case the Nitrokey is lost. Only the first option is described below. In order to create a key with backup, you can access the following instructions and use this general information to transfer the key to the Nitrokey.
Dentro do GnuPG já existe um comando «gerar», que pode ser usado para criar facilmente chaves no dispositivo. No entanto, ainda não é possível selecionar diretamente o tipo de chave, por isso a chave deve ser preparada primeiro. Para isso, usamos os seguintes comandos:
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 1 19 brainpoolP256r1" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 2 18 brainpoolP256r1" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 3 19 brainpoolP256r1" /bye
Alternativamente, outras curvas podem ser selecionadas, como descrito na próxima seção.
Agora entramos gpg2 --card-edit e vemos que o brainpoolP256r1 está sob «atributos chave» em vez de rsa2048.
> gpg2 --card-edit
Reader ...........: 20A0:4109:0000000000000:0
Application ID ...: D276000124010303000500005F100000
Version ..........: 3.3
Manufacturer .....: ZeitControl
Serial number ....: 00005F10
Name of cardholder: [not set]
Language prefs ...: [not set]
Sex ..............: unspecified
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: forced
Key attributes ...: brainpoolP256r1 brainpoolP256r1 brainpoolP256r1
Max. PIN lengths .: 64 64 64
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]
Depois criamos a chave.
gpg/card> admin
Admin commands are allowed
gpg/card> generate
Make off-card backup of encryption key? (Y/n) n
Please note that the factory settings of the PINs are
PIN = '123456' Admin PIN = '12345678'
You should change them using the command --change-pin
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: Jane Doe
Email address: jane.doe@example.org
Comment:
You selected this USER-ID:
"Jane Doe <jane.doe@example.org>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
gpg: key 7F8C68E1B084E169 marked as ultimately trusted
gpg: revocation certificate stored as '/home/jane/.gnupg/openpgp-revocs.d/F8C00BC1636A7D7604A31A877F8C68E1B084E169.rev'
public and secret key created and signed.
A Nitrokey incorpora agora criptografia de curva elíptica em vez das chaves RSA e pode ser usada como de costume.
Curvas Disponíveis¶
No procedimento acima escolhemos as curvas de Brainpool. Alternativamente, as curvas NIST podem ser usadas. A configuração é feita da seguinte forma:
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 1 19 nistp256" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 2 18 nistp256" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 3 19 nistp256" /bye
Atualização do GnuPG no Ubuntu¶
Os passos seguintes só são necessários se você estiver executando uma versão do Ubuntu mais antiga que 18.04. Você pode instalar o GnuPG 2.1.18 em tal sistema com os comandos abaixo. Isto envolve pacotes Debian mais recentes, o que é a opção mais fácil. Esta abordagem tem sido testada com sucesso no Ubuntu 17.10 e provavelmente funciona também no 16.04. No entanto, a ocorrência de problemas durante a utilização não pode ser excluída.
$ mkdir gnupg_tmp
$ cd gnupg_tmp
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/gnupg_2.1.18-8~deb9u1_amd64.deb
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/dirmngr_2.1.18-8~deb9u1_amd64.deb
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/gnupg-agent_2.1.18-8~deb9u1_amd64.deb
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/scdaemon_2.1.18-8~deb9u1_amd64.deb
$ sudo dpkg -i *
$ cd ..
$ rm -rf gnupg_tmp
Caso você queira desfazer a instalação, você tem que executar os seguintes comandos:
$ sudo dpkg --remove --force-depends gnupg dirmngr gnupg-agent scdaemon
# (removes manually installed packages)
$ sudo apt-get install gnupg dirmngr gnupg-agent scdaemon
# (installs the appropriate packages from regular package repositories)