【问题标题】:How to give hex string to Hmac SHA256 objective C?如何将十六进制字符串提供给 Hmac SHA256 目标 C?
【发布时间】:2017-08-14 21:05:10
【问题描述】:

我正在尝试通过以下方式在目标 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 

考虑到密钥为 hexkey 正在生成 hmac。所以显然生成的hmac是不同的。

我如何告诉目标 C 中的 CCMac 函数将密钥视为十六进制密钥?我已经尝试将字符串键转换为字节数组并将其传递给 CCMAC 但仍然没有工作。

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

【问题讨论】:

  • 如果不是字符串,什么是“hexkey”?
  • 它是一个十六进制字符串,例如:3b7fc8987611a158e561a35cba001fd6。
  • 对不起,困惑...你想使用Objective-C吗?并且想知道如何获得与 openssl 相同的结果?

标签: ios objective-c xcode sha256 hmac


【解决方案1】:

这是你要找的吗?

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

【讨论】:

  • 感谢 DonMag!这正是我一直在寻找的,抱歉我的问题并不清楚。我想匹配openSsl和hmac的结果
  • 能否解释一下你在dataFromHexString函数中做了什么?
  • 这里的dataFromHexString 函数只是将一串十六进制值转换为一个NSData 对象。例如,“A”的 ASCII/十进制值是 65(0x41),“B”是 66(0x42),“C”是 67(0x43),因此函数将字符串“414243”转换为包含“ABC”的字节缓冲区 - 这是 CCHmac() 函数所期望的。
猜你喜欢
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 2019-07-27
  • 2019-02-21
  • 1970-01-01
  • 2017-08-23
相关资源
最近更新 更多