mac funciones firma criptográficas code cifrado caracteristicas iphone objective-c cocoa-touch ios encryption

funciones - Implementación del algoritmo de cifrado HMAC en la aplicación de iPhone



sha hmac 160 (2)

Quiero implementar el algoritmo de encriptación HMAC para mi aplicación de iPhone. Cualquier código de muestra realmente ayudará. Además, por favor guíame con una breve implementación de la misma.


HMAC no es un mecanismo de cifrado, sino un resumen de autenticación. Utiliza una función subyacente de resumen de mensajes como SHA-1, SHA-256, MD5, etc., con una clave secreta para generar un código que se puede usar para autenticar datos.

Generar un resumen de HMAC es extremadamente simple. Aquí está la descripción de RFC2104 (a través de Wikipedia)

Dejar:

  • H (·) sea una función hash criptográfica (es decir, SHA-1, SHA-256, MD5, etc.)
  • K es una clave secreta acolchada a la derecha con ceros adicionales al tamaño de bloque de entrada de la función de almohadilla, o el hash de la clave original si es más larga que ese tamaño de bloque
  • m ser el mensaje a ser autenticado
  • | denotar concatenación
  • ⊕ denote exclusivo o (XOR)
  • opad sea el relleno externo (0x5c5c5c ... 5c5c, constante hexadecimal de un bloque de longitud)
  • ipad sea el relleno interior (0x363636 ... 3636, constante hexadecimal de un bloque de longitud)

Entonces HMAC (K, m) se define matemáticamente por:

HMAC (K, m) = H ((K ⊕ opad) | H ((K ⊕ ipad) | m)).

Para la función de resumen subyacente puede ayudarse a sí mismo a una de las implementaciones C de OpenSSL. De hecho, también tiene una implementación C de HMAC que probablemente solo puedas usar tal cual.


Use las funciones comunes de Criptografía. La documentación está en páginas man, por lo que tendrás que buscarla un poco. Están en libSystem en iOS y Mac OS X, por lo que no es necesario agregar otra biblioteca o marco a su proyecto. Como puede ver en el siguiente ejemplo, la API es muy similar a la de OpenSSL.

Si en realidad está interesado en encriptar, en lugar de autenticar datos, Common Crypto tiene funciones para realizar AES y 3DES (y DES, pero no lo usa, es demasiado débil para las necesidades modernas). Eche un vistazo a la página man CCCryptor para más detalles.

El ejemplo siguiente es equivalente a ejecutar openssl dgst -md5 -hmac secret < myfile.txt . Comience por inicializar el CCHmacContext, y luego llame a CCHmacUpdate mientras tenga datos para autenticarse. Cuando haya leído todos los bytes, llame a CCHmacFinal para colocar el HMAC en un búfer. He proporcionado un método crudo para convertir los bytes de HMAC en hexadecimal imprimible.

#include <CommonCrypto/CommonHMAC.h> #include <sys/types.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> extern int errno; int main( int ac, char *av[] ) { CCHmacContext ctx; char *key = "secret"; char buf[ 8192 ]; unsigned char mac[ CC_MD5_DIGEST_LENGTH ]; char hexmac[ 2 * CC_MD5_DIGEST_LENGTH + 1 ]; char *p; int fd; int rr, i; if ( ac != 2 ) { fprintf( stderr, "usage: %s path/n", av[ 0 ] ); exit( 1 ); } if (( fd = open( av[ 1 ], O_RDONLY )) < 0 ) { fprintf( stderr, "open %s: %s/n", av[ 1 ], strerror( errno )); exit( 2 ); } CCHmacInit( &ctx, kCCHmacAlgMD5, key, strlen( key )); while (( rr = read( fd, buf, sizeof( buf ))) > 0 ) { CCHmacUpdate( &ctx, buf, rr ); } if ( rr < 0 ) { perror( "read" ); exit( 2 ); } CCHmacFinal( &ctx, mac ); (void)close( fd ); p = hexmac; for ( i = 0; i < CC_MD5_DIGEST_LENGTH; i++ ) { snprintf( p, 3, "%02x", mac[ i ] ); p += 2; } printf( "%s/n", hexmac ); return( 0 ); }