Autenticação Criptográfica

Resumão

MAC significa Código de Autenticação de Mensagem (Message Authentication Code). Este código é enviado junto com a mensagem, para provar sua integridade e autenticidade.

Integridade: Se algum bit da mensagem for alterado o MAC fica inválido. Semelhante a enviar a mensagem junto com sua hash.

Autenticidade: Apenas quem possui a chave criptográfica K é capaz de criar e verificar uma mensagem autenticada com esta chave.

A partir da chave e da mensagem criamos o código de autenticação, também chamado de TAG de autenticação. Enviamos o par (MENSAGEM, TAG) e quem recebe este par pode verificar a integridade e autenticidade da mensagem usando a chave K.

A chave K e a tag de autenticação precisam ambas ter comprimentos de acordo com o nível de segurança da aplicação.

Autenticação HMAC

A primeira opção é HMAC, que usa uma Função Hash para criar o código de autenticação. Eis o algoritmo:

se (comprimento(K) > Hash.Tamanho_Bloco) { K = Hash(K) }
enquanto (comprimento(K) < Hash.Tamanho_Bloco) { K = K || 00 }
K1 = K XOR 5C…5C
K2 = K XOR 36…36
TEMP = Hash(K2 || MENSAGEM)
TAG = Hash(K1 || TEMP)

Usamos uma chave para criar duas chaves diferentes. Cada uma é usada em uma etapa: criar uma hash da mensagem (TEMP) e tag de autenticação (TAG). Note que estamos utilizando o símbolo || com o significado de concatenação.

Antes de gerar K1 e K2, a chave K deve ter o tamanho do bloco da função hash. Este preenchimento do bloco permite pré-computar Hash(K1) e Hash(K2), acelerando a autenticação.

Se o comprimento da chave K for maior que o bloco de entrada da função hash (64 bytes/512 bits para SHA-256 ou 128 bytes/1024 bits SHA-512), primeiro realizamos a hash da chave.

Então, se o comprimento da cahve K for menor que o tamanho do bloco de entrada da função hash adicionamos zeros até completar o tamanho.

Podemos usar qualquer função hash com HMAC.

TAG =HMAC-SHA256(K, MENSAGEM)
TAG =HMAC-SHA512(K, MENSAGEM)

Obviamente vamos utilizar hashes que são criptograficamente seguras, por exemplo SHA2 e SHA3, e com comprimentos de saída adequados para o nível de segurança exigido pela aplicação. A chave K também precisa ser longa o suficiente para ser segura.

Autenticação KMAC

KMAC é uma extensão do padrão SHA3 usando XOFs (funções hash com saída de comprimento variável) baseada na esponja criptográfica Keccak.

Uma vantagem clara de usar KMAC, é que permite diferentes comprimentos de saída, gerando TAGs completamente diferentes para cada comprimento de saída.

KMAC é mais flexível e complicada que HMAC. Não vamos entrar em detalhes.

Podemos escolher entre os níveis de segurança máximos de 128 e 256 bits.

TAG =KMAC-128(K, MENSAGEM, COMPRIMENTO_TAG)
TAG =KMAC-256(K, MENSAGEM, COMPRIMENTO_TAG)

A chave K e a TAG precisam ter comprimentos compatíveis com o nível de segurança da aplicação e a função KMAC também precisa ser escolhida adequadamente. Ex: chave 256 bits e tag 256 bits só fazem sentido com KMAC-256.

Autenticação CBC-MAC

É possível também usar o sistema de autenticação CBC-MAC, que usa cifras em blocos como AES em modo CBC.

CBC-MAC possui características semelhantes a HMAC. Usa duas chaves diferentes K1 e K2, geradas a partir de uma chave mestre K. Primeiro calculamos Cn, o último bloco do modo CBC com a chave K1. Então criptografamos este bloco com a chave K2, gerando a tag de autenticação.

K1 = K XOR 5C…5C
K2 = K XOR 36…36
C0 = EK1(IV)
Ci = EK1(Pi XOR Ci-1)
Cn = EK1(Pn XOR Cn-1)
TAG = EK2(Cn)

A tag de autenticação tem o mesmo comprimento do bloco da cifra, 128 bits no caso de AES.

TAG = CBC-MAC-AES(K, MENSAGEM)

Porque não usar HMAC ou KMAC sempre? Em sistemas embarcados com pouca memória de programa, por exemplo, pode ser inviável implementar uma cifra (como AES-128) e também uma hash (como SHA2 ou SHA3). Então usa-se a cifra para ambos criptografia e autenticação.

Vetor de inicialização e MACs

Note que no modo CBC-MAC, deixamos explícito a existência de um vetor de inicialização (IV).

Este é um nonce, um número utilizado apenas uma vez com a chave K. Ele pode ser aleatório ou um contador incrementado a cada mensagem.

O nonce serve para que duas mensagens tenham tags diferentes, mesmo se o conteúdo seja idêntico.

HMAC e KMAC também podem utilizar um IV, basta colocá-lo logo antes da mensagem:

MENSAGEM = IV || MENSAGEM

Isso é semelhante ao CBC-MAC, que coloca o IV no bloco zero, antes da mensagem.

Se considerarmos os IV como sendo parte da mensagem, sua função é de fazer com que sempre tenhamos uma mensagem diferente sendo autenticada, gerando sempre uma tag diferente.

Note que o vetor de inicialização (IV) é enviado junto com a mensagem, ou seja, não é secreto. Em alguns casos ele não é transmitido, se pode ser identificado pelo contexto.

Links Externos

Wikipedia HMAC

HMAC – FIPS PUB 198-1 – The Keyed-Hash Message Authentication Code

KMAC – NIST 800-185 – SHA-3 Derived Functions

Wikipedia CBC-MAC

CBC-MAC – FIPS PUB 113 – Computer Data Authentication

Leia mais:

Veja mais posts na Categoria Criptografia!

Funções HASH Criptográficas

Resumão

Uma função hash processa uma mensagem de tamanho arbitrário (qualquer número de bytes) e cria a partir dela uma sequência de bytes de tamanho fixo.

Ela deve ser uma função unidirecional, ou seja, não deve ser possível (ao menos na prática) realizar sua inversa. Deve dar resultados iguais para mensagens iguais e resultados claramente diferentes para mensagens diferentes. Mesmo para mensagens parecidas (trocando ou adicionando um bit ou uma letra) a diferença no resultado deve ser bem evidente.

Atualmente existem dois padrões de função hash considerados criptograficamente seguros: SHA2 e SHA3.

Ambos padrões definem hashes de diferentes tamanhos de saída e, consequentemente, diferentes níveis de segurança criptográficos: 224, 256, 384 e 512 bits.

Para uma aplicação que exige n bits de segurança criptográfica, usa-se uma hash com 2n bits de saída. Por exemplo, se eu preciso de 128 bits de segurança eu vou utilizar SHA-256 (SHA2) ou SHA3-256, que possuem o dobro de bits de saída.

Na dúvida ou se não estiver especificado, utilize 128 bits de segurança.

HashSaídaSegurançaUsado em conjunto
com criptografia
SHA-224
SHA3-224
224 bits112 bits3DES (DES triplo)
SHA-256
SHA3-256
256 bits128 bitsAES-128
SHA-384
SHA3-384
384 bits192 bitsAES-192
SHA-512
SHA3-512
512 bits256 bitsAES-256
Hashes criptográficas seguras SHA2 e SHA3, tamanho da saída, segurança e algorítimos de criptografia com segurança equivalente.

Para que serve uma função Hash?

As funções hash servem ser utilizadas para diferentes propósitos.

Integridade de dados. Pode ser utilizada para confirmar que uma mensagem (ou arquivo) foi enviado corretamente. Quem envia a mensagem manda junto sua hash. Quem recebe a mensagem calcula a hash da mensagem e compara com a recebida.

Assinatura digital. Diretamente assinar digitalmente uma mensagem (ou arquivo) de tamanho arbitrário é complicado. Especialmente se muito grande exigiria chaves criptográficas tão grande quanto as mensagens. A assinatura digital então é realizada sobre a hash da mensagem, que tem um comprimento fixo.

Funções Hash Criptográficas

Funções hash criptográficas, além de associar uma saída de tamanho fixo com uma mensagem de tamanho arbitrário, tem objetivo de resistir a ataques criptográficos. Dessa forma elas podem ser utilizadas em conjunto com esquemas de criptografia.

Para isso ela deve resistir a três diferentes ataques: pré-imagem, segunda pré-imagem e colisão. Eles são discutidos abaixo.

Ataque Pré-imagem de Hash

Deve ser muito difícil (praticamente impossível) de encontrar uma mensagem x que gere uma hash pré-definida y. Ou seja, a função hash não deve ser invertível.

Por exemplo, o só o gênio da lâmpada poderia atender a este desejo:
“Eu quero encontrar uma mensagem cujo valor da SHA3-256 é e05dbb98c0c3665c1c95290a8c2245ba32ad7e366502f2a5fdb37b4001054692.”
Talvez nem ele.

Resposta: Uma palavra, dez letras, sem acentos, tudo minúsculo. Se calcular SHA3-224 dá 80ab895e2f664ab13a76581f41e8226a85540d5d9617eab2c29a5792.
Quer tentar? Você tem 2610 = 141.167.095.653.376 chances. Calculadora online SHA3-256.

Alguém capaz de realizar a pré-imagem, pode descobrir qual a mensagem a partir de sua hash.

De onde vem esse nome “pré-imagem”? Vem do conteúdo de matemática chamado funções. Uma função y = f(x) tem seu domínio (valores de x) e sua imagem (valores de y). Para uma função hash, o algoritmo é f, o domínio são as mensagens x e a imagem são os valores das hashes y. Pré-imagem significa ter a imagem e, a partir dela, determinar o domínio correspondente (como uma função inversa).

Ataque Segunda Pré-imagem de Hash

Se eu tenho uma mensagem x1 que tem uma hash y, deve ser muito difícil (praticamente impossível) de encontrar uma mensagem diferente x2 que dê a mesma hash y.

Pode soar muito parecido com o anterior. Sim, é!

Mas este ataque considera que o atacante conhece a mensagem original e quer descobrir uma segunda mensagem com mesma hash. Ou seja, conhecer a mensagem não deve dar nenhuma vantagem adicional para um ataque.

Eis aqui mais um pedido para o gênio da lâmpada:
“Eu quero uma mensagem diferente que dê a mesma SHA3-256 que ‘Olá, banco! Envie R$1.000,00 para Oscar. Obrigado!’ “

Alguém capaz de realizar a segunda pré-imagem, pode forjar assinaturas digitais. Pode trocar a mensagem assinada por uma outra mensagem, sem que isso seja percebido.

De onde vem esse nome “segunda pré-imagem”? Já temos uma pré-imagem: a pré-imagem de y é x1. Mas queremos uma segunda pré-imagem x2.

Ataque Colisão de Hash

Deve ser muito difícil (praticamente impossível) de encontrar duas mensagens diferentes x1 e x2 que dão uma mesma hash y.

Pode soar muito parecido com o anterior. Sim, é!

Mas este ataque não faz nenhuma restrição com respeito as mensagens, nem ao valor da hash.

Eis aqui mais um pedido para o gênio da lâmpada:
“Eu quero duas mensagens diferentes que dão a mesma SHA3-256. Não importa qual valor final da hash.”

Alguém capaz de realizar colisões pode gerar muita confusão e dor de cabeça em sistemas que dependem de hashes.

De onde vem esse nome “colisão”? Imagine que as mensagens são carros e o resultado da hash seja a vaga do estacionamento que devem usar. Mesmo quando da mesma marca, modelo, ano… são carros diferente e vão estacionar em vagas diferentes. Dois carros querendo entrar na mesma vaga geram uma colisão.

Links Externos

Wikipedia SHA2

Especificação SHA2

Wikipedia SHA3

Especificação SHA3

Leia mais:

Veja mais posts na Categoria Criptografia!