O HMAC (Hash-base Message Authentication Code) e usado para verificar a integridade de informacoes e arquivos. Mecanismos que verificam a integridade baseados em uma chave secreta sao usualmente chamados de MAC (message authentication codes), baseados em 2 partes que compartilham 2 chaves secretas para validar a informacao transmitida. O HMAC usa uma variedade de algoritmos como: MD5, SHA1, SHA256, RIPEMD-128/160, entre outros.exemplo_hmac.py:import hmacimport hashlib# o hmac.new possui 3 argumentos: chave, msg e o modulo do hashgerar_resumo=hmac.new('chave_secreta','',hashlib.md5)f=open('arquivo.txt','rb')try: while True: bloco=f.read(1024) if not bloco: break gerar_resumo.update(bloco)finally: f.close()resumo=gerar_resumo.hexdigest()print resumoOs dados sao criptografados usando o hash atual combinado com uma chave secreta: hash(K XOR 5c5c5c... + hash(K XOR 363636... + msg)), sendo K a chave secreta usada para comprimir blocos de dados atraves da funcao hash denotada por B (geralmente de 64 bytes):>>> from md5 import md5>>> print md5().block_size64Tudo isso resulta em um pequeno resumo de tamanho fixo. Por exemplo, aplicando um hash MD5 em um arquivo de 1GB ou qualquer outro tamanho resultara sempre em um resumo com o mesmo tamanho de 128 bits e 32 caracteres hexadecimais: Verificando a integridade com o hashlib e md5sum:>>>import hashlib>>>hashlib.md5(open('arquivo.txt', 'r').read()).hexdigest()'530477e014c4f7b7296939da49a52a62'$ md5sum arquivo.txt 530477e014c4f7b7296939da49a52a62 arquivo.txtSabemos que o MD5 e vulneravel aos ataques de colisao, que e feito gerando uma colisao (conjunto de dados com o mesmo resultado de hash). Porem isso nao compromete o uso do HMAC pois as colisoes do MD5 dependem de condicoes iniciais. Mesmo se: MD5(a)==MD5(b), MD5(x+a)!=MD5(x+b) e se uma chave HMAC em branco x comece com 64 bytes de zeros o XOR terminara com 36, resultando em um primeiro bloco MD5 de 363636... O MD5 e SHA1 foram desenvolvidos para serem rapidos, se tornando uma vantagem para o atacante que decide usar a forca bruta para quebrar o hash, podendo testar cerca de 400 bilhoes de chaves por segundo.Entendendo a colisao:Nesse exemplo tirado desse site, temos 2 executaveis diferentes com a mesma identidade:hello - MD5 Sum: da5c61e1edc0f18337e46418e48c1290erase - MD5 Sum: da5c61e1edc0f18337e46418e48c1290Esses dois arquivos foram gerados explorando a estrutura de blocos da funcao MD5, onde um arquivo de entrada sera anexado primeiro (seu tamanho sera multiplo de 64 bytes), depois ele e dividido em blocos individuais de 64 bytes. O hash MD5 e computado atraves dos estados das sequencias de 16-bytes de acordo com a regra: si+1 = f(si, Mi), onde f e uma funcao fixa com estado inicial s0 fixo (vetor de inicializacao). O estado final sn e o hash MD5.O metodo de Wang e Yu usa um vetor de inicializacao s para encontrar dois pares de blocos M, M' e N,N' assim como f(f(s,M),M')=f(f(s,N),N'). Assim e possivel encontrar pares de arquivos de tamanhos arbitrarios, que sao identicos , exceto pelos 128 bytes no meio do arquivo e que possuem hash MD5 identicas.* Fontes:https://pymotw.com/2/hmac/http://dankaminsky.com/2015/05/07/the-little-mac-attack/http://tools.ietf.org/html/rfc2104.htmlhttp://benlog.com/2008/06/19/dont-hash-secrets/ Uma amiga me disse: Maria, o que e seu volta!Eu fiquei pensando...Deve ser a teoria do bumerangue......so espero que nao volte no meu olho! A Unimed e realmente incredula. A dica do dia e a seguinte: Na hora da escolha do plano de saude uma informacao deve ter peso 2: Orientacao religiosa. Fuja dos ateus!!! Se o teu for agnostico,