HMAC hash-based message athentication code
Es un conjunto especifico de información y campos para calcular un código de autenticacion de mensajes (MAC) Involucra una funcion hash y una llave de cifrado MD5 ,SHA-1 y RIPEMD-128/160 son ejemplos de dichas funciones hash y el resultado de usar una o la otra es HMAC-MD5 o HMAC-SHA1 o HMAC-RIPEMD
La seguridad de HMAC está relacionada con la seguridad de la función hash que se use, el tamaño de la salidad de dicha función hash y del tamaño y la robustez de la llave usada.
HMAC matemáticamente… Donde H: funcion hash K: llave m: es el mensaje que será autenticado Opad: encabezado exterior Ipad: encabezado interno
Algoritmo function hmac (key, message) if (length(key) > blocksize) then key = hash(key) // keys longer than blocksize are shortened end if if (length(key) < blocksize) then key = key ∥ [0x00 * (blocksize - length(key))] // keys shorter than blocksize are zero-padded (where ∥ is concatenation) o_key_pad = [0x5c * blocksize] ⊕ key // Where blocksize is that of the underlying hash function i_key_pad = [0x36 * blocksize] ⊕ key // Where ⊕ is exclusive or (XOR) return hash(o_key_pad ∥ hash(i_key_pad ∥ message)) end function
Llave Las llaves usadas necesitan ser totalmente aleatorias, o como mínimo pseudoaleatorias, también deben actualizarse constantemente Pueden ser de longitud N
Hash MD5 Message-Digest Algorithm 5 Algoritmo Adicion de bits: Se agrega un bit 1 y despues 0s hasta completar un número congruente con 448,modulo 512, es decir, si se resta 448 a dicho número, el módulo 512 de dicha resta será cero.
Longitud del mensaje Un entero de 64 bits que represente la longitud 'b' del mensaje (longitud antes de añadir los bits) se concatena al resultado del paso anterior. En el supuesto no deseado de que 'b' sea mayor que 2^64, entonces sólo los 64 bits de menor peso de 'b' se usarán.
Inicializar el buffer MD Se usan 4 palabras (A,B,C y D) de 32 bits y se inicializan con valores hexadecimales de la siguiente manera: palabra A: 01 23 45 67 palabra B: 89 ab cd ef palabra C: fe dc ba 98 palabra D: 76 54 32 10
Procesado del mensaje en bloques de 16 palabras 4 funciones con 3 palabras de entradas y una de salida
Salida Se leen todos los bits de A,B,C y D en ese orden. Empezando por el menos significativo de A hasta llegar al más significativo de D A B 100000… 1011101 …..
Implementaciones de HMAC Python 2 librería Lib/hmac.py hmac.new(key[, msg[, digestmod]]) HMAC.update(msg) HMAC.digest() HMAC.copy()
HMAC vacios HMAC_MD5("", "") = 0x74e6f7298a9c2d168935f58c001bad88 HMAC_SHA1("", "") = 0xfbdb1d1b18aa6c08324b7d64b71fb76370690e1d HMAC_SHA256("", "") = 0xb613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad
Ejemplos… HMAC_MD5("key", "The quick brown fox jumps over the lazy dog") = 0x80070713463e7749b90c2dc24911e275 HMAC_SHA1("key", "The quick brown fox jumps over the lazy dog") = 0xde7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9 HMAC_SHA256("key", "The quick brown fox jumps over the lazy dog") = 0xf7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8
Referencias https://www.ietf.org/rfc/rfc2104.txt http://en.wikipedia.org/wiki/Hash-based_message_authentication_code http://en.wikipedia.org/wiki/MD5 https://docs.python.org/2/library/hmac.html