【发布时间】:2013-08-20 16:09:24
【问题描述】:
我需要将密码转换为 MD5 哈希,并将其与我从 Web 服务获得的 MD5 哈希进行比较。 如果这两个匹配,用户可以登录。
假设用户的密码是“cat”。如果我对此进行哈希处理,我会得到d077f244def8a70e5ea758bd8352fcd8。这等于我从 web 服务收到的哈希值。现在我知道创建 MD5 的代码是正确的。
但是,当密码是“çàt”时,我得到这个哈希值:727f8e931135b44b37eb147c8a7a56af。网络服务将这个哈希返回给我:f571ca52b4e3c5a6f49675deaea89cac。
这就是问题所在。由于某种原因,这两个同一个词的哈希值不同,甚至不知道这样的事情是可能的。 仅当密码中有重音符号或其他奇怪字符时才会发生这种情况,因此我认为这与编码有关。
我尝试像这样使用NSISOLatin1StringEncoding:
NSString *string = [NSString stringWithFormat:@"çàt"];
char converted[([string length] + 1)];
[string getCString:converted maxLength:([string length] + 1) encoding: NSISOLatin1StringEncoding];
NSString *converted_str = [NSString stringWithCString:converted encoding:NSISOLatin1StringEncoding];
在这里找到:Convert UTF-8 encoding to ISO 8859-1 encoding with NSString
但这也没有给我正确的哈希值。
我尝试了所有可能的 NSString 编码,但没有一个返回正确的哈希值。
那么我能做些什么呢。转换编码的代码有问题吗?或者它可能与编码没有任何关系(因为尝试其他编码不起作用)?
【问题讨论】:
-
让我们在 Google 中输入
d077f244def8a70e5ea758bd8352fcd8,你就会明白为什么密码永远不应该用 MD5 散列,尤其是没有盐的情况下。有一些密钥派生函数,如 BCrypt 或 PBKDF2,旨在散列密码。
标签: ios objective-c encoding hash md5