O Yubico OTP é um ID Público e Senha criptografados de 44 caracteres, de uso único, seguros e criptografados em 128 bits, quase impossíveis de falsificar. O OTP é composto por duas partes principais: os primeiros 12 caracteres permanecem constantes e representam o ID público do próprio dispositivo YubiKey. Os 32 caracteres restantes formam uma senha exclusiva para cada OTP gerado.
Exemplos de saídas de uma YubiKey de serie 5 onde o botão foi pressionado três vezes:
cccjgjgkhcbbirdrfdnlnghhfgrtnnlgedjlftrbdeut
cccjgjgkhcbbgefdkbbditfjrlniggevfhenublfnrev
cccjgjgkhcbbcvchfkfhiiuunbtnvgihdfiktncvlhck
A senha é gerada a partir de várias fontes aleatórias, incluindo contadores para sessões YubiKey e OTPs gerados. Quando um Yubico OTP é verificado, os valores do contador de sessão e OTP são comparados aos últimos valores enviados. Se os contadores forem menores que os valores usados anteriormente, o OTP será rejeitado. Copiar um OTP não permitirá que outro usuário falsifique uma YubiKey — o valor do contador permitirá que o servidor de validação saiba quais OTPs já foram usados.
O OTP de saída do Yubico OTP é fornecido no conjunto de caracteres Modhex. O conjunto de caracteres Modhex usa caracteres comuns na maioria dos layouts de teclado QWERTY do alfabeto latino, permitindo a funcionalidade independentemente do conjunto de idiomas.
Hex |
a |
b |
c |
d |
e |
f |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Modhex |
l |
n |
r |
t |
u |
v |
c |
b |
d |
e |
f |
g |
h |
i |
j |
k |
Essa substituição pode ser facilmente programada. Por exemplo, no Linux, a conversão de uma string aleatória de 6 caracteres hexadecimais para modhex pode ser realizada com o comando:
openssl rand -hex 6 | tr abcdef0123456789 lnrtuvcbdefghijk
O algoritmo de geração do Yubico OTP
A geração do YubiKey OTP é composta pelos seguintes campos, criptografados com uma chave AES de 128 bits exclusiva. O resultado é a string modhex de 32 caracteres incluída após o ID público de 12 caracteres.
Mnemonic |
Byte offset |
Size |
Description |
uid |
0 |
6 |
Private (secret) id |
useCtr |
6 |
2 |
Usage counter |
tstp |
8 |
3 |
Timestamp |
sessionCtr |
11 |
1 |
Session usage counter |
rnd |
12 |
2 |
Random number |
Private ID
O campo id privado compreende 6 bytes copiados do valor de configuração do campo id privado. Este campo pode ser usado para armazenar uma identidade privada que pode ser acessada quando o OTP é descriptografado em um servidor de validação Yubico OTP contendo a chave AES usada para criptografar o OTP.
A instância de verificação deve verificar este campo em relação ao valor esperado. Se um OTP for criptografado com uma chave AES não correspondente, este campo será inválido e, nesse caso, o OTP será rejeitado.
Contador de uso da sessão
Na inicialização, o contador de uso da sessão é zerado. Após a geração de cada novo OTP, esse campo é incrementado em uma unidade. Se esse campo mudar de 0xff para 0, o campo do contador de uso será incrementado automaticamente.
Contador de uso
Timestamp
O timestamp é um campo de 24 bits incrementado com uma taxa de aproximadamente 8 Hz. O valor do carimbo de data/hora é definido como um valor aleatório após a inicialização do gerador interno de números aleatórios.
Números aleatórios
Um número aleatório de 16 bits é escolhido do gerador interno de números aleatórios para adicionar alguma entropia adicional ao resultado final.
Checksum
Fonte: developers.yubico.com
Segurança