Pular para o conteúdo
Todos os conceitos

Assinatura presente mas não verificada

Uma assinatura só protege se alguém a conferir com uma chave secreta; presente e ignorada, não vale nada.

Para deixar um dado ir e voltar pelo cliente com segurança, assina-se: junto do payload vai um HMAC, uma marca calculada com uma chave secreta que só o servidor conhece. Ao receber, o servidor recalcula o HMAC e compara. Se bater, o payload não foi mexido; se não bater, recusa.

O erro comum não é a assinatura estar errada, é ela não ser conferida. O token chega como payload.assinatura, parece protegido, mas o código desserializa o payload e usa os campos sem nunca chamar a verificação. A marca vira enfeite. Como nada compara, você edita o payload e deixa a assinatura antiga (ou vazia): passa igual.

Duas variantes do mesmo buraco: chave fraca ou pública (o atacante assina o próprio payload) e verificação depois de já usar o dado. O certo é verificar antes de usar, com chave secreta forte, comparando em tempo constante (timingSafeEqual, ou hmac.compare_digest em Python) para não vazar o resultado pelo tempo.

token recebido payload (editado) . assinatura (antiga) servidor desserializa e confia verify() nunca é chamada A assinatura existe mas ninguém a confere, então o payload editado passa.
O token é payload mais assinatura; o servidor desserializa e confia no payload sem nunca chamar verify, então a marca não protege.

Aparece nestes desafios