2014-08-31 55 views
0

我正在嘗試爲我的學校開發一個與PowerSchool交互的應用程序,該程序允許用戶查看他們的成績,教師,日程安排等等。我找到了一個與PowerSchool交互的基礎知識庫,使用PHP編寫,並且一直試圖在過去的一週內以客觀的方式編寫它。看來問題是我如何用用戶的密碼創建一個HMAC(MD5)。要麼我使用十六進制文摘而不是摘要,不確定。我從服務器返回的錯誤是奇數個字符。 這裏是鏈接到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

謝謝你的回覆,我會看看你提到的建議。我知道現在的問題是密碼,因爲我驗證了所有其他字段的正確設置。 Off主題我也來自北卡羅來納州的羅利。 – 2014-09-01 00:27:01

+0

你應該出來Cocoaheads(http://www.meetup.com/nscoderrtp/)。帶上你的代碼。很多聰明的人在這個小組裏,我們每個星期都會見面(我試着不時地出去,儘管我比想象的要多)。關於密碼,它看起來像是由多個部分組成的,所以我會開始分解它以查看哪一步出錯。 – 2014-09-01 02:33:26

+0

沒有。大多數人羣年齡偏大,但我們有少數青少年經常出席。 – 2014-09-01 03:30:34