2012-05-26 2 views
1

정말 어떻게 할 수 있는지 모르지만 MD5 해시 용 파일 두 개를 확인 중이므로 동일하거나 유사한 지 확인할 수 있습니다.MD5는 iOS의 온라인 파일에 올바른 해시를 제공하지 않습니다.

문제는 로컬 파일 (앱 번들에 저장된 파일)이 올바른 값을 제공하고 온라인 서버에 저장된 값이 나쁜 값을 제공한다는 것입니다. 그러나 Mac의 Terminal 또는 일부 인터넷 도구로 온라인 파일의 md5를 확인하면 올바른 값을 제공합니다.

어떻게 가능합니까?

이것은 기본적으로 내가하고있는 일입니다.

.H 파일 :

enter image description here


이 (어딘가에서 온라인으로 볼) 내가 사용하고 MD5 확장은 다음과 같습니다

NSData *currencyData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.iworldtip.com/appl/texts/files/CountryCurrency.plist"]]; 
NSData *localCurrencyData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"CountryCurrency" ofType:@"plist"]]; 

NSString *currencyDataHashValue = [currencyData md5]; 
NSString *localCurrencyDataHashValue = [localCurrencyData md5]; 

if (![currencyDataHashValue isEqual:localCurrencyDataHashValue]) { 
      NSLog(@"Saving new version of currency plist\n\n%@ - %@", currencyDataHashValue, localCurrencyDataHashValue); 
... 
... 

는 출력
@interface NSString (MyExtensions) 
- (NSString *) md5; 
@end 

@interface NSData (MyExtensions) 
- (NSString*)md5; 
@end 

.m 파일 :

#import "md5Extension.h" 
#import <CommonCrypto/CommonDigest.h> 

@implementation NSString (MyExtensions) 
- (NSString *) md5 
{ 
    const char *cStr = [self UTF8String]; 
    unsigned char result[16]; 
    CC_MD5(cStr, strlen(cStr), result); // This is the md5 call 
    return [NSString stringWithFormat: 
      @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", 
      result[0], result[1], result[2], result[3], 
      result[4], result[5], result[6], result[7], 
      result[8], result[9], result[10], result[11], 
      result[12], result[13], result[14], result[15] 
      ]; 
} 
@end 

@implementation NSData (MyExtensions) 
- (NSString*)md5 
{ 
    unsigned char result[16]; 
    CC_MD5(self.bytes, self.length, result); // This is the md5 call 
    return [NSString stringWithFormat: 
      @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", 
      result[0], result[1], result[2], result[3], 
      result[4], result[5], result[6], result[7], 
      result[8], result[9], result[10], result[11], 
      result[12], result[13], result[14], result[15] 
      ]; 
} 
@end 
+0

NSLog로'currencyData'와'localCurrencyData'? – mttrb

+1

또한 plist 파일을 보내도록 구성된 서버는 어떤 content-type입니까? – mttrb

+0

문제가 서버에 있다고 생각하지 않습니다. 왜냐하면 나는 온라인 md5 도구에 URL을 넣으려고했기 때문에 나에게 맞는 도구를 주었다. 나는 데이터를 출력하려고하지 않았다. 그것을 시도해보고 그것을 말해 줄 것이다. :) –

답변

3

그래서 문제가있는 곳을 발견했습니다.

우선 나는 바보입니다. 출력을보고 문제가 원격 파일이라고 생각했지만 로컬 파일에 잘못된 해시가 제공되었습니다.

다음은 프로젝트를 컴파일 할 때 Xcode가 자동으로 수행하는 변환으로 인해 발생했습니다. XML Plist 파일을 이진 Plist 파일로 변환합니다. 따라서 MD5 해시가 다릅니다.

그래서 최종 해결책은이 원격 파일을 바이너리 목록으로 변환하는 것이었고 모든 것이 매력처럼 작동합니다!


PS : 나는 속성 목록을 편집하기위한 훌륭한 도구를 발견 - 그것은 PlistEdit Pro라고합니다. Plists로 상상할 수있는 모든 것을 할 수 있습니다. - 바이너리로 변환하거나 반대로 변환 할 수 있습니다. (plutil로 터미널에서 수행 할 수 있지만이 방법이 더 편리한 해결책입니다.)

+0

Mac 터미널에서 Xcode와 동일한 해시를 생성하는 방법을 알고 있습니까? – Arc676

관련 문제