ios - 如何将十六进制字符串提供给 Hmac SHA256 Objective-C ?

标签 ios objective-c xcode sha256 hmac

我正在尝试通过以下方式在 Objective-C 中生成 hmac SHA256:

const char *cKey  = [key cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

只要 key 是一个字符串,这就可以正常工作。问题出在用于生成 mac 的外部服务器命令上:

openssl dgst -binary -sha256 -mac HMAC -macopt hexkey:$key 

将生成的 hmac 考虑为 hexkey 。所以显然生成的 hmac 是不同的。

我如何告诉 Objective-C 中的 CCMac 函数将 key 视为十六进制 key ?我已经尝试将字符串键转换为字节数组并将其传递给 CCMAC,但仍然没有成功。

在 android 中,我通过将十六进制数转换为大整数然后对其执行 getBytes 来实现相同的目的,使用它来创建 key 。 希望你们中的一些人能够指导我。

最佳答案

这是您要找的吗?

- (NSData *)dataFromHexString:(NSString *)sHex {
    const char *chars = [sHex UTF8String];
    int i = 0;
    NSUInteger len = sHex.length;

    NSMutableData *data = [NSMutableData dataWithCapacity:len / 2];
    char byteChars[3] = {'\0','\0','\0'};
    unsigned long wholeByte;

    while (i < len) {
        byteChars[0] = chars[i++];
        byteChars[1] = chars[i++];
        wholeByte = strtoul(byteChars, NULL, 16);
        [data appendBytes:&wholeByte length:1];
    }

    return data;
}

- (NSData *)hmacForHexKey:(NSString *)hexkey andStringData:(NSString *)data
{

    NSData *keyData = [self dataFromHexString:hexkey];

    const char *cKey  = [keyData bytes];
    const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];

    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];

    CCHmac(kCCHmacAlgSHA256, cKey, keyData.length, cData, strlen(cData), cHMAC);

    return [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];

}

- (NSData *)hmacForKey:(NSString *)key andStringData:(NSString *)data
{

    const char *cKey  = [key cStringUsingEncoding:NSUTF8StringEncoding];
    const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];

    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];

    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

    return [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];

}

- (void)testIt {

    NSString *key = @"This is my random key.";
    NSString *hexKey = @"54686973206973206d792072616e646f6d206b65792e";

    NSString *data = @"This is a data string.";

    NSData *hmac1 = [self hmacForKey:key andStringData:data];
    NSLog(@"hmacForKey   : %@", hmac1);

    NSData *hmac2 = [self hmacForHexKey:hexKey andStringData:data];
    NSLog(@"hmacForHexKey: %@", hmac2);
}

关于ios - 如何将十六进制字符串提供给 Hmac SHA256 Objective-C ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42956922/

相关文章:

c# - 使用 C# 与 NSUrlSession 的 HTTP POST 多部分表单数据

xcode - Eclipse - 如何在 Eclipse 中使用 Mac OS X (Xcode) 工具链?

c++ - 如何最好地将 Xcode 和 Visual Studio 与同一个 git 存储库一起使用?

javascript - webview 与 native iOS 应用程序通信的任何方式?

iphone - 适用于 iOS 和 MacOS X 的应用程序

ios - 捕获单元格的索引值,但仅来自屏幕上的可见单元格

iphone - 我可以获取 iOS UIPasteboard 的所有名称吗?

iphone - 拍摄快照时,显示出很少的白色背景颜色

ios - 类型 'PHPhotoLibrary' 的值没有成员 'presentLimitedLibraryPicker' - Xcode 11.3.1

iphone - 按下锁定按钮时 AVAudioRecorder 停止