在iPhone应用程序中实现HMAC加密算法

时间:2011-05-02 20:39:13

标签: iphone objective-c cocoa-touch ios encryption

我想为我的iPhone应用程序实现HMAC加密算法。任何示例代码都会有所帮助。另外,请指导我简要实施相同的内容。

2 个答案:

答案 0 :(得分:21)

使用Common Crypto功能。 documentation位于手册页中,因此您需要稍微寻找它。它们位于iOS和Mac OS X上的libSystem中,因此无需在项目中添加其他库或框架。从下面的示例中可以看出,API与OpenSSL非常相似。

如果您真的对加密感兴趣,而不是验证数据,Common Crypto具有执行AES和3DES(和DES,但不使用它,它对于现代需求来说太弱)的功能。有关详细信息,请查看CCCryptor手册页。

以下示例相当于运行openssl dgst -md5 -hmac secret < myfile.txt。首先初始化CCHmacContext,然后只要有数据进行身份验证就调用CCHmacUpdate。当您读取所有字节时,请调用CCHmacFinal以将HMAC放入缓冲区。我提供了一种粗略的方法来将HMAC字节转换为可打印的十六进制。

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

答案 1 :(得分:4)

HMAC不是加密机制,而是身份验证摘要。它使用底层消息摘要功能,如SHA-1,SHA-256,MD5等,使用密钥生成可用于验证数据的代码。

生成HMAC摘要非常简单。以下是RFC2104(通过维基百科)

的描述

让:

  • H(·)是加密哈希函数(即SHA-1,SHA-256,MD5等)
  • K是一个填充到右边的密钥,对散列函数的输入块大小加上额外的零,或者如果它长于该块大小则为原始密钥的散列
  • m是要进行身份验证的消息
  • |表示连接
  • ⊕表示独占或(XOR)
  • opad是外部填充(0x5c5c5c ... 5c5c,一个块长的十六进制常量)
  • ipad是内部填充(0x363636 ... 3636,一个块长的十六进制常量)

然后HMAC(K,m)在数学上定义为:

HMAC(K,m)= H((K + opad)| H((K⊕ipo)| m))。

对于底层摘要功能,您可以自助使用OpenSSL中的一个C实现。实际上它也有一个HMAC的实现,您可以按原样使用它。