Мне нужно преобразовать пароль в хэш MD5 и сравнить его с MD5-хешем, который я получаю из web-сервиса. Если эти два совпадения, пользователь может войти в систему.MD5 хэши из строки не совпадают
Предположим, что пароль пользователя 'cat'. Если я сделаю хэш из этого, я получу d077f244def8a70e5ea758bd8352fcd8
. Это равно хешу, который я получаю от веб-сервиса. Теперь я знаю, что код для создания 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, но ни один из них не возвращал правильный хэш.
Так что я могу с этим поделать. Что-то не так с кодом для преобразования кодировки? Или, может быть, это не имеет никакого отношения к кодированию (поскольку попытки других кодировок не работают)?
Позволяет напечатать 'd077f244def8a70e5ea758bd8352fcd8' в Google, и вы увидите, почему пароль никогда не должен быть хеширован MD5, особенно без соли. Существуют ключевые функции вывода, такие как BCrypt или PBKDF2, которые предназначены для хэш-паролей. – martinstoeckli