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

Posted

技术标签:

【中文标题】在 iPhone 应用程序中实现 HMAC 加密算法【英文标题】:Implementing HMAC encryption algorithm in iPhone application 【发布时间】:2011-08-17 06:14:24 【问题描述】:

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

【问题讨论】:

【参考方案1】:

使用通用加密函数。 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 );

【讨论】:

谢谢!我在我们的博客上对此进行了总结,并为 NSString 制作了一个类别以供进一步使用。请参阅blog.blackwhale.at/?p=801。干杯,安卡【参考方案2】:

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

生成 HMAC 摘要非常简单。这是来自 RFC2104 的描述(通过 Wikipedia)

让:

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 ⊕ ipad) | m))。

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

【讨论】:

谢谢院长。 IOS 中应该使用哪个 API 来利用 HMAC 身份验证摘要?有示例代码吗? 我认为iOS中没有任何内置API,您必须自己编写。您需要从 OpenSSL 获取源代码并手动将其添加到您的应用程序中。 咳咳opensource.apple.com/source/CommonCrypto/CommonCrypto-55010/…

以上是关于在 iPhone 应用程序中实现 HMAC 加密算法的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中实现 HMAC-SHA1

数据加密

在 VB.NET 中实现 bittrex API

iPhone:如何在 iPhone 中实现崩溃报告功能?

如何在 iPhone 应用程序中实现 UIButton / UILabel 'padding'

如何在 iPhone 应用中实现手写识别功能?