【问题标题】:Trouble with HMAC for password being sent to website将密码发送到网站的 HMAC 出现问题
【发布时间】:2014-08-31 22:17:43
【问题描述】:

我正在尝试为我的学校制作一个与 PowerSchool 交互的应用程序,该软件允许用户查看他们的成绩、教师、日程安排等。我找到了一个库,用于与用 PHP 编写的 PowerSchool 交互的基础知识,并且在过去一周一直在尝试用目标 c 编写它。似乎问题在于我如何使用用户密码创建 HMAC (MD5)。要么我使用的是十六进制摘要而不是摘要,不确定。我从服务器返回的错误是奇数个字符。 这是我要重新创建的 PHP 库类的链接: https://github.com/horvste/powerapi-php/blob/master/src/PowerAPI/Core.php 这是我的测试项目中的代码, 命令行主类: https://gist.github.com/anonymous/c40cdd99a826c06073aa NSString 类别实现文件:

#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

感谢您抽出宝贵时间查看此问题!

【问题讨论】:

    标签: ios objective-c hmac powerschool


    【解决方案1】:

    首先,不要在这里构建自己的 HMAC 例程。使用 CCHmac。它是内置的,可以正确处理 HMAC+MD5。

    如果可能的话,我建议您阅读 API 文档,而不是尝试对另一个代码库进行逆向工程。您可能会忽略 PHP 中发生的许多小事情; API 文档应该解释所有这些。

    如果 PHP 代码是您唯一的参考,那么您应该分解每个部分,看看哪里出了问题。例如,验证您是否以相同的形式获取身份验证数据。然后确认每个程序在给定相同的身份验证数据的情况下生成相同的 HMAC。然后确认给定相同的 HMAC,每个程序生成相同的响应。等等。在某个地方你正在做一些不同的事情。确保您在相同的地方使用 Base64 与原始数据(PHP 开发人员倾向于将 Base64 字符串视为实际上是原始数据,这在使用 ObjC 时会导致混淆)。

    当然,您应该检查服务器日志以验证您的最终请求是否与 PHP 请求匹配。

    【讨论】:

    • 感谢您的回复,我会查看您提到的建议。我知道问题出在密码上,因为我验证了所有其他字段都正确设置。题外话我也来自北卡罗来纳州罗利。
    • 你应该来 Cocoaheads (meetup.com/nscoderrtp)。带上你的代码。团队中有很多聪明的人,我们每周都会见面(我不时尝试出去,尽管我想念的比我想的要多)。关于密码,看起来好像是由几部分组成的,所以我开始分解它,看看哪一步出错了。
    • 没有。主要是年龄较大的人群,但我们有少数青少年经常参加。
    猜你喜欢
    • 2021-11-11
    • 2018-01-03
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2012-09-11
    • 2023-03-18
    • 2014-02-12
    • 2021-02-09
    相关资源
    最近更新 更多