首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有SHA1输入目标的HMAC SHA1

具有SHA1输入目标的HMAC SHA1
EN

Stack Overflow用户
提问于 2015-10-12 11:50:01
回答 2查看 1.6K关注 0票数 3

我需要使用HMAC-SHA1 1散列NSData输入。我使用了这个代码:

代码语言:javascript
复制
- (NSString *)HMACSHA1:(NSData *)data {
    NSParameterAssert(data);

    const char *cKey = [@"SampleSecretKey012345678" cStringUsingEncoding:NSUTF8StringEncoding];
    const void *cData = [data bytes];

    unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];

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

    NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];\

    /* Returns hexadecimal string of NSData. Empty string if data is empty. */

    const unsigned char *dataBuffer = (const unsigned char *)[HMAC bytes];

    if (!dataBuffer) {
        return [NSString string];
    }

    NSUInteger dataLength = [HMAC length];
    NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)];

    for (int i = 0; i < dataLength; ++i) {
        [hexString appendFormat:@"%02x", (unsigned int)dataBuffer[i]];
    }

    return [NSString stringWithString:hexString];
}

但是十六进制字符串输出总是错误的(从服务器上检查)。我想问题是这条线:

const void *cData = [data bytes];

因为如果以与键相同的方式转换数据(示例"test“字符串):

const void *cData = [@"test" cStringUsingEncoding:NSUTF8StringEncoding];

然后使用以下页面检查结果:HMAC地窖,结果是匹配的。

如果我散列了一个NSString,那么我可以使用cStringUsingEncoding:,但我无法计算出如何将NSData转换为const void*。有人能帮我吗?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-12 16:41:46

通用密码支持SHA1、MD5、SHA256、SHA384、SHA512和SHA224。

这里有一个示例实现,它比较简单,不确定它是否解决了您的问题,因为没有提供输入/期望的输出:

代码语言:javascript
复制
- (NSString *)HMACSHA1:(NSData *)data {
    NSParameterAssert(data);

    NSData *keyData = [@"SampleSecretKey012345678" dataUsingEncoding:NSUTF8StringEncoding];
    NSMutableData *hMacOut = [NSMutableData dataWithLength:CC_SHA1_DIGEST_LENGTH];

    CCHmac(kCCHmacAlgSHA1,
           keyData.bytes, keyData.length,
           data.bytes,    data.length,
           hMacOut.mutableBytes);

    /* Returns hexadecimal string of NSData. Empty string if data is empty. */
    NSString *hexString = @"";
    if (data) {
        uint8_t *dataPointer = (uint8_t *)(hMacOut.bytes);
        for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) {
            hexString = [hexString stringByAppendingFormat:@"%02x", dataPointer[i]];
        }
    }

    return hexString;
}
票数 1
EN

Stack Overflow用户

发布于 2015-10-12 12:08:47

我建议您使用苹果的CommonCrypto框架,因为您有硬件加速的SHA计算。

我不知道它是否是HMAC (据我所知,它是受支持的,但没有尝试),但我会考虑切换您的服务器(或其他什么)以兼容,因为在iOS端,硬件支持更快。

编辑:您可以在索夫问题上阅读更多关于这个主题的内容。

编辑2:在Github还有一个很好的包装 (Swift)用于CommonCrypto。无论如何,它会让您了解如何实现它,以及CommonCrypto支持什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33080404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档