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
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ãoNa 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 usoO contador de uso é um contador não volátil cujo valor é preservado mesmo quando o dispositivo é desconectado. Na primeira vez que o dispositivo é usado após uma inicialização ou reinicialização, esse valor é incrementado em 1 e o contador de sessão é definido como zero.Este campo tem apenas 15 bits de largura, dando um intervalo utilizável de 1 – 0x7fff. Quando esse contador atinge 0x7fff, ele para aí. Alguém poderia pensar que isso poderia levar a uma YubiKey a ser praticamente inútil durante sua vida se isso ocorrer. No entanto, considerando que uma YubiKey é usada cinco vezes ao dia, 365 dias por ano, levará 18 anos para o contador travar. Além disso, como esse contador incrementa apenas na primeira vez após a inicialização/reinicialização, a vida útil prática é ainda maior.
Se o contador atingir o valor final, o dispositivo ainda pode ser reconfigurado, o que causaria a reinicialização do contador. O campo é armazenado no formato little-endian, ou seja, o byte menos significativo sendo armazenado primeiro.
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.
Este campo pode ser usado pela parte verificadora para determinar o tempo decorrido entre dois OTPs subsequentes recebidos durante uma sessão.
Este campo muda de 0xffffff para 0 sem qualquer outra ação. Se usado pela parte verificadora, esta condição deve ser levada em consideração. Dada uma taxa de 8 Hz, o cronômetro será encerrado aproximadamente a cada 24 dias. O campo é armazenado no formato little-endian, ou seja, o byte menos significativo sendo armazenado primeiro.
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.
ChecksumFonte: developers.yubico.com