O que é o HMAC? – segurança terminologia hash

Pergunta:


Ao trabalhar em um projeto que usa sha256 e chaves de segurança, me deparei com o termo hmac.

Eu ainda não sei bem a fundo do que se trata, e gostaria de entender um pouco mais.

Tenho as seguintes dúvidas:

  • O que seria um HMAC?
  • O HMAC tem alguma coisa a ver com o hash (md5, sha1, sha256)?
  • Por que escuto sempre algo como “cálculo do HMAC”? O que seria esse “cálculo”?
  • Ele tem alguma finalidade para segurança das informações? Se sim, cite exemplos.

E por último:

  • Como se pronuncia? Eu sempre falo: “Agá-mequi”
Autor da pergunta Wallace Maxters

hugomg

HMAC é uma sigla para Hash-based Message Authentication Code

O que seria um HMAC?

Um HMAC é um tipo de MAC (código de autenticação de mensagem). Um MAC é um código que você pode adicionar ao final de uma mensagem para proteger a integridade da mensagem, garantindo que ela foi recebida pelo destinatário sem alterações acidentais ou maliciosas.

A maneira mais simples de tentar proteger a integridade de uma mensagem seria incluir um checksum no final. Isso protegeria contra modificações acidentais mas não protegeria contra modificações maliciosas, já que uma pessoa mal intencionada poderia recalcular o checksum para fazê-lo conferir com a mensagem modificada.

Para proteger contra modificações maliciosas podemos usar um MAC criptograficamente seguro. Esse MAC é tipo um checksum, mas ele também depende de uma chave secreta que só autor da mensagem tem, o que teoricamente impede um adversário de recalcular o MAC de uma mensagem modificada.

O HMAC é um um algorítimo específico para gerar um MAC criptograficamente seguro a partir de uma chave secreta e de uma mensagem qualquer. É melhor usar esse algoritmo do que reinventar a roda pois muitos algoritmos simples como hash(chave + mensagem) são vulneráveis a ataques criptográficos como o ataque de extensão de tamanho.

O HMAC tem alguma coisa a ver com o hash (md5, sha1, sha256)?

Sim, o HMAC é um algoritmo geral que usa uma função de hash internamente. Essa função de hash pode ser qualquer hash criptográfico, como md5, sha1 ou sha256 e dependendo da função de hash que você usar você fica com uma versão diferente do HMAC (HMAC-MD5, HMAC-SHA1, HMAC-SHA256, etc).

Por que escuto sempre algo como “cálculo do HMAC”? O que seria esse “cálculo”?

O HMAC é um algoritmo e esse cálculo é simplesmente a execução desse algoritmo. A grosso modo, a função HMAC é definida por

HMAC(K, m) =  hash(K1 + hash(K2 + m))

onde:

  • K é a chave secreta
  • m é a mensagem
  • hash é a função de hash escolhida (md5, sha1, etc)
  • K1 e K2 são chaves secretas derivadas da chave original K
  • + é a operação de concatenação de strings.

Para mais detalhes, recomendo ler a RFC 2104 ou o artigo da Wikipédia

Ele tem alguma finalidade para segurança das informações? Se sim, cite exemplos.

Um exemplo de uso de MAC é que um servidor web pode entregar cookies para os seus usuários que podem ser lidos mas não modificados (pois qualquer modificação no conteúdo invalidaria o MAC).

Uma breve introdução sobre Código de Autenticação de Mensagem (MAC¹):

Um código de autenticação de mensagem é uma informação usada para autenticar uma mensagem. Um algorítimo MAC recebe como parâmetro uma chave secreta (compartilhada somente com o destinatário) e a mensagem em sí que será autenticada, e retorna um código de autenticação de mensagem. Este código é usado para verificar a integridade e autenticidade dos dados da mensagem.

Como podemos ver na representação abaixo, o remetente da mensagem usa um algoritmo para gerar o MAC da mensagem a ser enviada usando a chave secreta. A mensagem e MAC são enviados para o destinatário. Ele em posse da chave secreta executa o mesmo algoritmo sobre a mensagem e verifica se o MAC gerado é igual ao enviado pelo rementente. Se eles são iguais, o destinatário pode assumir que a integridade e autenticidade da mensagem estão ok.

inserir a descrição da imagem aqui
Representação de troca de informações usando código de autenticação de mensagem (MAC).
Adaptada de: Message Authentication Code – Wikipedia
¹MAC = Message Authentication Code

O que é um HMAC – Hash-based Message Authentication Code?

É um tipo de código de autenticação de mensagem (MAC) envolvendo em sua construção uma função hash (H) criptográfica combinando com uma chave secreta.

SHA-1, MD5 e outras funções hash criptográficas podem ser usadas no cálculo do HMAC e sua força criptográfica pode variar de acordo com a função hash utilizada.

Na definição RFC 2104 é apresentada uma representação da função/cálculo HMAC, onde:

  • H(·) é uma função hash criptográfica
  • K é uma chave secreta preenchida com zeros extras à direita para entrada no bloco do tamanho da função hash , ou o hash da chave original se esta é maior que o tamanho do bloco
  • m é a mensagem a ser autenticada
  • ∥ denota concatenação
  • ⊕ denota ou exclusivo (XOR)
  • opad é o preenchimento externo (0x5c5c5c…5c5c), um bloco de comprimento constante hexadecimal)
  • ipad é o preenchimento interno (0x363636…3636), um bloco de comprimento constante hexadecimal)

Descrição e representação obtida em: HMAC – Wikipédia, a enciclopédia livre

inserir a descrição da imagem aqui

Exemplo real de utilização de HMAC:

Um caso de uso que tive experiência foi a validação da autenticidade e integridade de notificações enviadas de um sistema de pagamento para um sistema de e-commerce (utilizando HMAC-SHA1), referentes à status de transações (confirmações e cancelamentos de pagamentos de produtos).

Esta validação é importante para termos certeza que a resposta vem do sistema de pagamento e não é de um indivíduo com más intenções forjando um POST de confirmação de pagamento de uma transação, por exemplo. A chave secreta utilizada neste caso é a API Key fornecida pelo sistema de pagamento.

Como se pronuncia HMAC?

Nos primeiros segundos deste vídeo e este vídeo também é possível ouvir a pronúncia do termo em inglês.

Referências:

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *