在iPhone应用程序中实现HMACencryptionalgorithm

我想为我的iPhone应用程序实现HMACencryptionalgorithm。 任何示例代码将真正帮助。 另外,请指导我简要介绍一下。

使用Common Cryptofunction。 该文档在手册页,所以你需要寻找一点。 它们位于iOS和Mac OS X的libSystem中,因此不需要为您的项目添加其他库或框架。 正如你从下面的例子可以看到的,API和OpenSSL非常相似。

如果你真的对encryption感兴趣,而不是authentication数据,Common Crypto具有执行AES和3DES(和DES,但不使用它,对现代需求来说太弱)的function。 查看CCCryptor手册页获取详细信息。

下面的例子相当于运行openssl dgst -md5 -hmac secret < myfile.txt 。 首先初始化CCHmacContext,然后调用CCHmacUpdate,只要有数据进行身份validation即可。 读完所有字节后,调用CCHmacFinal将HMAC放入缓冲区。 我提供了一个粗略的方法来将HMAC字节转换为可打印的hex。

 #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 ); } 

HMAC不是一种encryption机制,而是一种authentication摘要。 它使用底层消息摘要函数(如SHA-1,SHA-256,MD5等)和一个密钥来生成可用于validation数据的代码。

生成一个HMAC摘要是非常简单的。 这里是来自RFC2104的描述(通过维基百科)

让:

  • H(·)是密码散列函数(即SHA-1,SHA-256,MD5等)
  • K是一个秘密密钥,向右填充散列函数的input块大小,如果它大于块大小,则为原始密钥的散列值
  • m是要authentication的消息
  • | 表示连接
  • ⊕表示排他或(XOR)
  • opad是外部填充(0x5c5c5c … 5c5c,一个hex常量)
  • ipad是内部填充(0x363636 … 3636,一个hex常量)

那么HMAC(K,m)在math上定义为:

HMAC(K,m)= H((K×opad)| H((K×ipad)| m))。

对于底层摘要函数,您可以帮助您自己从OpenSSL的C实现之一。 实际上它也有一个HMAC的C实现,你可以直接使用。