2014-08-31 54 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