我需要使用HMAC-SHA1 1散列NSData输入。我使用了这个代码:
- (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*。有人能帮我吗?谢谢!
发布于 2015-10-12 16:41:46
通用密码支持SHA1、MD5、SHA256、SHA384、SHA512和SHA224。
这里有一个示例实现,它比较简单,不确定它是否解决了您的问题,因为没有提供输入/期望的输出:
- (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;
}https://stackoverflow.com/questions/33080404
复制相似问题