2011-04-19 2 views
-1

hmac sha256 암호화를 사용하여 내 서버에 로그인하려고하는데, PHP 코드가 작동하지만 아이폰에서 작동하지 않아서 아이폰에서 hmac이 산출된다는 것을 추적했습니다. PHP 코드 같은 입력에게 주어진 PHP 코드에 서로 다른 출력은php to iphone code - CCHmac kCCHmacAlgSHA256

$privatekey = '6-y6f"\%BjSM;HBo\'sPr")5#t2nb-LG*;])f^Si['; 
    $identity_arrow_getSecret = $privatekey; 
    $date_c = "2011-04-18T23:56:28+0800"; 
    $uri = '/backend/1/User/Header'; 

    $stringToSign = "GET\n\n\n" . $date_c . "\n" . $uri; 
    $signature = hash_hmac("sha256", utf8_encode($stringToSign), $identity_arrow_getSecret); 
    echo "stringToSign is $stringToSign <HR>"; 
    echo "signature is $signature <HR>"; 

목표 - C 코드 당신은 Base64로 클래스를 확인 할 수 있습니다

NSString* uri = @"/backend/1/User/Header"; 
NSString* date_c = @"2011-04-18T23:56:28+0800"; //[dateFormatter stringFromDate:[NSDate date]]; 
NSString* stringToSign = [NSString stringWithFormat:@"GET\n\n\n%@\n%@" , date_c , uri]; 
NSLog(@" stringToSign : %@ <>\r\n", stringToSign); 

NSString* privatekey = @"6-y6f\"\%BjSM;HBo\'sPr\")5#t2nb-LG*;])f^Si["; 

const char *cKey = [privatekey cStringUsingEncoding:NSASCIIStringEncoding]; 
const char *cData = [stringToSign cStringUsingEncoding:NSASCIIStringEncoding]; 

unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH]; 

CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC); 

NSString *hash = [HMAC base64EncodedString]; 
NSLog(@" hash : %@ \r\n", hash); 

답변

1

입니다. Kiichi Takeuchi에 의해 작성된 Base64 클래스를 사용하고 그것은 C#에서 검증 한 루틴에 동일한 결과를 제공하므로 올바른 것으로 가정합니다.

Base64 라이브러리는 NSData 구조 만 인코딩하므로 코드를 약간 변경해야합니다. 다음과 같은 모습입니다.

CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC); 
NSData *nsd = [[NSData alloc] initWithBytes: cHMAC length:CC_SHA256_DIGEST_LENGTH]; 

NSString *hash = [Base64 encode:nsd]; 
[nsd release]; 
NSLog(@" hash : %@ \r\n", hash); 
+1

프로젝트를 계속하지 않았으므로 도움이 될지 모르겠으므로 올바른 것으로 표시하지 않으면 잘못된 방식으로 사용하지 마십시오. 아니 – Maysam