使用密钥和消息在swift中创建哈希

时间:2014-10-30 14:43:37

标签: ios objective-c swift

我想使用swift中的键创建字符串的SHA1 hmac哈希。在obj-c中我使用了它并且效果很好:

+(NSString *)sha1FromMessage:(NSString *)message{

    const char *cKey  = [API_KEY cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cData = [message cStringUsingEncoding:NSUTF8StringEncoding];

    NSLog(@"%s", cData);

    unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];

    CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
    NSData *HMACData = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)];

    const unsigned char *buffer = (const unsigned char *)[HMACData bytes];
    NSMutableString *HMAC = [NSMutableString stringWithCapacity:HMACData.length * 2];

    for (int i = 0; i < HMACData.length; ++i){
        [HMAC appendFormat:@"%02hhx", buffer[i]];
    }
    return HMAC;
}

但是现在我很难把它翻译成快速的。这就是我到目前为止所做的:

static func sha1FromMessage(message: String){

        let cKey = RestUtils.apiKey.cStringUsingEncoding(NSASCIIStringEncoding)!
        let cData = message.cStringUsingEncoding(NSUTF8StringEncoding)!
        let cHMAC = [CUnsignedChar](count: Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0)

        CCHmac(kCCHmacAlgSHA1, cKey, cKey.count, cData, cData.count, cHMAC)
        ...
}

和这一行

CCHmac(kCCHmacAlgSHA1, cKey, cKey.count, cData, cData.count, cHMAC)

已经给我一个错误 Int无法转换为CCHmacAlgorithm 。有关如何将obj-c代码翻译为swift的任何想法吗?

2 个答案:

答案 0 :(得分:1)

CCHmac()函数的最后一个参数的类型为UnsafeMutablePointer<Void>,因为 结果写入的地方。您必须将cHMAC声明为变量 并将其作为 in-out表达式传递给&。此外,还有一些类型的转换 是必要的:

var cHMAC = [CUnsignedChar](count: Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0)
CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA1), cKey, UInt(cKey.count), cData, UInt(cData.count), &cHMAC)

答案 1 :(得分:0)

Apple枚举值在Swift中的定义不同。而不是kCCHmacAlgSHA1,它可能定义为CCHmacAlgorithm.SHA1

这里的答案如下: https://stackoverflow.com/a/24411522/2708650