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

我想用swift中的一个键创build一个string的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?

CCHmac()函数的最后一个参数的types为UnsafeMutablePointer<Void>因为这是写入结果的地方。 您必须将cHMAC声明为variables ,并将其作为inputexpression式传递给& 。 另外,一些types转换是必要的:

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

苹果枚举值在Swift中有不同的定义。 它可能被定义为像CCHmacAlgorithm.SHA1 ,而不是CCHmacAlgorithm.SHA1

这里回答这里: https : //stackoverflow.com/a/24411522/2708650