2013-08-20 2 views
0

Мне нужно преобразовать пароль в хэш 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, но ни один из них не возвращал правильный хэш.

Так что я могу с этим поделать. Что-то не так с кодом для преобразования кодировки? Или, может быть, это не имеет никакого отношения к кодированию (поскольку попытки других кодировок не работают)?

+0

Позволяет напечатать 'd077f244def8a70e5ea758bd8352fcd8' в Google, и вы увидите, почему пароль никогда не должен быть хеширован MD5, особенно без соли. Существуют ключевые функции вывода, такие как BCrypt или PBKDF2, которые предназначены для хэш-паролей. – martinstoeckli

ответ

1

Я бы сказал, что 727 ... вы получите правильно, это то, что дает инструмент командной строки md5. Так что ваша часть сервера сломана - и, как вы уже сказали, вероятно, это просто некорректная кодировка - будьте осторожны при передаче текста на сервер.

0

С помощью этого метода вы вернуть md5 хэш строки в Objective-C, прежде чем у импортировать общего Crypto библиотеку

#import <CommonCrypto/CommonDigest.h> 

-(NSString*)md5HexDigest:(NSString*)input { 
const char* str = [input UTF8String]; 
unsigned char result[CC_MD5_DIGEST_LENGTH]; 
CC_MD5(str, strlen(str), result); 

NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2]; 
for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) { 
    [ret appendFormat:@"%02x",result[i]]; 
} 
return ret; 

}

убедитесь, что вы используете ту же систему кодирования в обеих частях, вашем приложении и веб-сервисе, я рекомендую использовать «UTF-8», но если вы используете «латинский 1», то в своем веб-сервисе вы должны использовать «iso-850-1»

1

Он делает связаны с кодировкой текста. Помните, что хеш MD5 работает на байтах, а не на символах. Таким образом, кодирование текста, который вы ему кормите, имеет значение!

Вот последовательности байтов, которые хэш результатов вы видите:

d077f244def8a70e5ea758bd8352fcd8 = 63 61 74  ("cat", ASCII) 

727f8e931135b44b37eb147c8a7a56af = c3 a7 c3 a0 74 ("çát", UTF-8 NFC) 

f571ca52b4e3c5a6f49675deaea89cac = e7 e0 74  ("çát", ISO8859-1) 

Во время работы над этим, пожалуйста, помните следующие очень важные моменты:

  • Не все символы могут быть представленный в ISO8859-1. Он ограничен персонажами, встречающимися на западноевропейских языках.
  • Могут быть множественные представления одного и того же символа, даже в UTF-8.В частности, акцентированные символы, такие как «á», могут быть представлены либо как один предварительно помеченный символ (U + 00E1 LATIN SMALL LETTER A WITH ACUTE), либо как комбинационная последовательность (U + 0061 LATIN SMALL LETTER A + U + 0301, КОМБИНИРОВАННАЯ ОСТРОМ АКЦЕНТ). Результаты выглядят одинаково (á vs. á), но будут обрабатываться как разные строки большинством процедур сравнения, а также хешей, если только они не будут нормированы.
Смежные вопросы