gpt4 book ai didi

php - HMAC - 在 Objective-C 中实现 PHP 算法

转载 作者:可可西里 更新时间:2023-11-01 00:38:37 27 4
gpt4 key购买 nike

我必须在我的 iPhone 应用程序中实现 HMAC MD5。该算法的 PHP 版本(用于验证的服务器端实现)在这里,我不能修改它(它是一个 API)

function hmac($key, $data) {
$b = 64; // byte length for md5
if (strlen($key) > $b) {
$key = pack("H*",md5($key));
}
$key = str_pad($key, $b, chr(0x00));
$ipad = str_pad('', $b, chr(0x36));
$opad = str_pad('', $b, chr(0x5c));
$k_ipad = $key ^ $ipad ;
$k_opad = $key ^ $opad;
$message = $k_opad . pack("H*",md5($k_ipad . $data));
return base64_encode(md5($message));
}

我找到了几个 Objective-C 实现:

- (NSString *)HMACMD5WithKey:(NSString *)key andData:(NSString *)data
{

const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_MD5_DIGEST_LENGTH];
CCHmac(kCCHmacAlgMD5, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
NSString *hash = [Base64 encode:HMAC];
return hash;
}

没有返回相同的结果(PHP != ObjC)。

我玩过 ObjC 实现,将摘要长度更改为 32(结果与 PHP 实现的长度相同), key 长度为 64(对应于第一个 str_pad),但结果总是不同。

谁能告诉我如何在 Objective-C 中得到相同的结果??

编辑:因为 ObjC 中的 2 个实现返回相同的结果,这里只有一个有用..

最佳答案

根据我之前的回答,PHP 代码实现了 HMAC 算法的非标准变体。这个 Objective C 代码应该模仿它。我在 Mac OS X 10.4.11 上针对两种组合的 PHP 代码对其进行了测试:

“快捷键”
“一些文字”

“这是一个很长的 key ,超过64个字节,这是重要的部分。”
“这是一些很长的文本,超过64字节,这是重要的部分。”

- (NSString *)HMACMD5WithKey:(NSString *)key andData:(NSString *)data {
const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];
const unsigned int blockSize = 64;
char ipad[blockSize], opad[blockSize], keypad[blockSize];
unsigned int keyLen = strlen(cKey);
CC_MD5_CTX ctxt;
if(keyLen > blockSize) {
//CC_MD5(cKey, keyLen, keypad);
CC_MD5_Init(&ctxt);
CC_MD5_Update(&ctxt, cKey, keyLen);
CC_MD5_Final((unsigned char *)keypad, &ctxt);
keyLen = CC_MD5_DIGEST_LENGTH;
} else {
memcpy(keypad, cKey, keyLen);
}
memset(ipad, 0x36, blockSize);
memset(opad, 0x5c, blockSize);

int i;
for(i = 0; i < keyLen; i++) {
ipad[i] ^= keypad[i];
opad[i] ^= keypad[i];
}

CC_MD5_Init(&ctxt);
CC_MD5_Update(&ctxt, ipad, blockSize);
CC_MD5_Update(&ctxt, cData, strlen(cData));
unsigned char md5[CC_MD5_DIGEST_LENGTH];
CC_MD5_Final(md5, &ctxt);

CC_MD5_Init(&ctxt);
CC_MD5_Update(&ctxt, opad, blockSize);
CC_MD5_Update(&ctxt, md5, CC_MD5_DIGEST_LENGTH);
CC_MD5_Final(md5, &ctxt);

const unsigned int hex_len = CC_MD5_DIGEST_LENGTH*2+2;
char hex[hex_len];
for(i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
snprintf(&hex[i*2], hex_len-i*2, "%02x", md5[i]);
}

NSData *HMAC = [[NSData alloc] initWithBytes:hex length:strlen(hex)];
NSString *hash = [Base64 encode:HMAC];
[HMAC release];
return hash;
}

关于php - HMAC - 在 Objective-C 中实现 PHP 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1629253/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com