我目前遇到此问题,数据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和大多数其他编码类型。
有人可以就如何解决这个问题提供解释或建议吗?提前谢谢!
答案 0 :(得分:1)
似乎http://www.sha1.cz将%nn
解释为百分比转义而http://www.tools4noobs.com/online_php_functions/sha1/不转义。例如:
b6589fc6ab0dc82cf12099d1c2d40ab994e8410c
。b6589fc6ab0dc82cf12099d1c2d40ab994e8410c
。所以第一个站点将“%30”解释为“0”,这是有道理的,因为“0”的ASCII码是0x30
。
但是这样的“百分比转义解码”对于任意一个没有多大意义 密码字符串。而对于“%f8”,目前还不清楚使用哪种编码来删除 逃脱的百分比。
所以我的结论是:b9b50de32d1bce1827a8e9d60ddbf4e0545fcb68
是正确的答案。要从http://www.sha1.cz获得相同的答案,
你必须用“%25”替换每个“%”字符,并且voilà:
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。玩得开心!