SHA-1在Objective-C和PHP ......中产生不同的结果?

时间:2014-01-23 20:44:20

标签: php ios encryption passwords sha1

我目前遇到此问题,数据API提供商在通过iOS应用进行通信时请求SHA-1哈希密码。它大约有95%的时间可以工作,但是一些特殊字符引起了很多麻烦。

以下是产生不同结果的密码 ABjnxQ ^ Lx2%f8vb

来自http://www.sha1.cz/ - >的 48518a5be263c7a222f4863b66889019aa272191

来自http://www.tools4noobs.com/online_php_functions/sha1/ - >的 b9b50de32d1bce1827a8e9d60ddbf4e0545fcb68

第二个是我的ObjC函数也返回。但是,API提供程序使用的PHP SHA1()获取第一个。我已将其缩小到这个样本中有%符号的事实。任何人都有与之相关的智慧吗?

这是我的Objective-C功能:

- (NSString *)hashPassword:(NSString *)pass {
    const char *cstr = [pass cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:pass.length];

    uint8_t digest[CC_SHA1_DIGEST_LENGTH];

    CC_SHA1(data.bytes, data.length, digest);

    NSMutableString *output = [[NSMutableString alloc] initWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];

    for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];

    return output;
}

在您建议编码之前,请注意我已尝试将编码类型更改为NSStringEncoding中的NSString.h枚举中的ASCII,UTF8,16,32和大多数其他编码类型。

有人可以就如何解决这个问题提供解释或建议吗?提前谢谢!

2 个答案:

答案 0 :(得分:1)

似乎http://www.sha1.cz%nn解释为百分比转义而http://www.tools4noobs.com/online_php_functions/sha1/不转义。例如:

所以第一个站点将“%30”解释为“0”,这是有道理的,因为“0”的ASCII码是0x30

但是这样的“百分比转义解码”对于任意一个没有多大意义 密码字符串。而对于“%f8”,目前还不清楚使用哪种编码来删除 逃脱的百分比。

所以我的结论是:b9b50de32d1bce1827a8e9d60ddbf4e0545fcb68正确的答案。要从http://www.sha1.cz获得相同的答案, 你必须用“%25”替换每个“%”字符,并且voilà:

  • http://www.sha1.cz将“ABjnxQ ^ Lx2%25f8vb”的哈希值计算为b9b50de32d1bce1827a8e9d60ddbf4e0545fcb68

这是第二个服务和你的Objective-C代码的计算。

可以使用NSString将“%”替换为“%25”(适用于http://www.sha1.cz) 方法stringByAddingPercentEscapesUsingEncoding:

答案 1 :(得分:1)

在我看来,这似乎是错误的PHP哈希函数。我同意 - %%符号是PHP SHA1功能的麻烦来源。 仅仅是为了我的好奇心 - 我尝试了其他非PHP在线工具(http://www.sha1-online.com/)来找出给定密码的SHA1哈希:

ABjnxQ ^ Lx2的%f8vb

它是:

b9b50de32d1bce1827a8e9d60ddbf4e0545fcb68

我不想抱怨设计不佳的PHP'语言',但试着阅读article: PHP: a fractal of bad design。玩得开心!