2014-08-31 1 views
0

사용자의 성적, 교사, 일정 등을 볼 수있는 소프트웨어 인 PowerSchool과 상호 작용하는 학교용 앱을 만들려고합니다. 저는 PHP로 작성된 PowerSchool과 상호 작용하는 기본 라이브러리를 발견했으며 지난 주 동안 객관적으로 C로 작성하려고했습니다. 문제는 사용자의 암호로 HMAC (MD5)를 만드는 방법입니다. 어느 것이 든 다이제스트가 아닌 16 진수 다이제스트를 사용하고 있습니다. 확실하지 않습니다. 서버에서 돌아 오는 오류는 홀수 문자입니다. 여기 내가 애 쓰고 PHP 라이브러리 클래스에 대한 링크입니다 다시 만들 : 여기 https://github.com/horvste/powerapi-php/blob/master/src/PowerAPI/Core.php 내 테스트 프로젝트에 내 코드, 명령 줄 메인 클래스 : https://gist.github.com/anonymous/c40cdd99a826c06073aa 는 NSString 범주 구현 파일 :비밀번호가 웹 사이트로 전송되는 중 HMAC에 문제가 발생했습니다.

#import "NSString+MyAdditions.h" 
@implementation NSString (MyAdditions) 

- (NSString *) hmacMD5WithData: (NSString *) data 
{ 
    const char *cKey = [self 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 = [HMAC base64EncodedStringWithOptions:0]; 
    return hash; 
} 
@end 

시간을내어이 문제를 살펴 줘서 고맙습니다!

답변

1

먼저 HMAC 루틴을 직접 작성하지 마십시오. CCHmac를 사용하십시오. 내장되어 있으며 HMAC + MD5를 올바르게 처리합니다.

다른 코드 기반을 리버스 엔지니어링하지 않고 API 문서로 이동하는 것이 좋습니다. PHP에서 여러분이 간과 할 수있는 많은 것들이 있습니다. API 문서는 그것들 모두를 설명해야한다.

PHP 코드가 유일한 참조라면, 각 부분을 분해하고 어디서 잘못되었는지 확인해야합니다. 예를 들어, 동일한 양식으로 인증 데이터를 가져 오는지 확인하십시오. 그런 다음 동일한 인증 데이터가 동일한 HMAC을 생성하면 각 프로그램이 실행되는지 확인하십시오. 그런 다음 동일한 HMAC가 주어지면 각 프로그램이 동일한 응답을 생성하는지 확인하십시오. 다른 곳에서 당신은 뭔가 다른 것을하고 있습니다. 동일한 장소에서 Base64와 원시 데이터를 사용하고 있는지 확인하십시오 (PHP 개발자는 Base64 문자열을 원시 데이터로 취급하기 때문에 ObjC로 넘어갈 때 혼란을 야기합니다).

물론 서버 로그를 검사하여 최종 요청이 PHP 요청과 일치하는지 확인해야합니다.

+0

답변 해 주셔서 감사 드리며 말씀 드린 제안을 살펴 보겠습니다. 나는 다른 모든 필드가 올바르게 만들어 졌음을 확인 했으므로 문제는 암호와 관련이 있음을 알고 있습니다. 화제 떨어져 나는 또한 Raleigh, NC에서이다. –

+0

코코아 헤드 (http://www.meetup.com/nscoderrtp/)에 나와야합니다. 코드를 가져 오십시오. 그룹의 영리한 사람들이 많고 매주 만나 죠 (나는 지금 나가고 싶어요. 내가 원하는 것 이상을 놓치더라도). 패스워드는 여러 조각으로 만들어져있는 것처럼 보입니다. 그래서 어떤 단계가 잘못되었는지 확인하기 위해 암호를 해독하기 시작합니다. –

+0

없습니다. 대부분 조금 나이 먹은 군중이지만, 정기적으로 출석하는 소수의 청소년도 있습니다. –

관련 문제