HMAC - Objective-C PHP algoritmasının gerçekleştirilmesi

2 Cevap php

Benim iPhone app HMAC MD5 uygulamak zorunda. Algoritması (doğrulama için uygulanan sunucu tarafı) PHP version burada ve ben (o bir API) değiştiremezsiniz

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));
}

Ben objektif-C uygulaması bir çift bulundu:

- (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;
}

Aynı sonuçları (PHP! = Objc) dönmedi.

Ben objc uygulamaları (sonuç, daha sonra PHP uygulama daha aynı uzunluğa sahip), 64 anahtar uzunluğu (ilk str_pad karşılık gelen) 32 özet uzunluğu değişen oynadı ama sonuç hep değişik bulunmaktadır.

Birisi nasıl Objective-C aynı sonucu bana söyleyebilir?

Düzenleme: objc içinde 2 uygulamalar tek burada yararlıdır aynı sonucu döndürür beri ..

2 Cevap

Benim önceki cevap başı olarak, PHP kodu HMAC algoritmasının standart olmayan bir varyantı uygular. Bu Objective C kodu taklit gerekir. Ben iki kombinasyonları için PHP kodu karşı, Mac OS X 10.4.11 üzerinde test:

"a short key"
"some text"

"This is a very long key. It is longer than 64 bytes, which is the important part."
"This is some very long text. It is longer than 64 bytes, which is the important part."

- (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;
}

İlk olarak, "ObjC2" SHA1 kullanarak değil, MD5 (MD5 16 bayt iken bu muhtemelen SHA1 yana taşması bir tampon almak demektir, 20 byte).

İkincisi, ben PHP hmac uygulamasında, standart olmayan bir varyasyon olduğunu düşünüyorum. Md5 son çağırmaları ama () bir paketi ile ("H *", ...) sarılmış nasıl fark? Pekala Base64 kodlama öncesi son ama biri olmasıdır. Bu PHP kodu Base64 verilerin 'basılabilir altıgen' temsilini (32 byte, her ASCII onaltılık rakam) değil 'ham' değeri (16 bayt) kodlayan demektir düşünüyorum.

Eğer PHP uygulaması değiştiremezsiniz beri, bu aynı standart olmayan varyasyon vardır Objective C hmac uygulama yazmak zorunda kalacak.