2014-11-01 3 views
0

문자열에서 sha1 해시를 만드는 두 가지 방법이 있습니다. 동일한 입력 데이터를 사용하면이 알고리즘은 다른 해시를 만들지 만 같은 해시를 만들어야합니다.obj-c와 swift에서 동일한 HMAC 알고리즘이 다른 해시를 만듭니다.

static func sha1FromMessage(message: String) -> String { 

    let cKey = RestUtils.API_KEY.cStringUsingEncoding(NSASCIIStringEncoding)! 
    let cData = message.cStringUsingEncoding(NSUTF8StringEncoding)! 

    var cHMAC = [CUnsignedChar](count: Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0) 
    CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA1), cKey, UInt(cKey.count), cData, UInt(cData.count), &cHMAC) 

    let output = NSMutableString(capacity: Int(CC_SHA1_DIGEST_LENGTH)) 

    for byte in cHMAC { 
     output.appendFormat("%02hhx", byte) 
    } 

    return output 
} 

및 OBJ-C I가 신속한 방법하고자

+(NSString *)sha1FromMessage:(NSString *)message{ 

    const char *cKey = [API_KEY cStringUsingEncoding:NSASCIIStringEncoding]; 
    const char *cData = [message cStringUsingEncoding:NSUTF8StringEncoding]; 

    unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH]; 

    CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC); 
    NSData *HMACData = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)]; 

    const unsigned char *buffer = (const unsigned char *)[HMACData bytes]; 
    NSMutableString *HMAC = [NSMutableString stringWithCapacity:HMACData.length * 2]; 

    for (int i = 0; i < HMACData.length; ++i){ 
     [HMAC appendFormat:@"%02hhx", buffer[i]]; 
    } 

    return HMAC; 
} 

하여 obj-C 방법과 동일한 해시를 리턴하는 (d80b816f0b46d5211b6d9487089597e181717ea6 작성하는) SWIFT에서

은 (617fb90f14f2eacecc333d558237bf8bb9fc85f7를 생성) . 문제가있는 아이디어가 있습니까?

답변

2

이유 cData

let cData = message.cStringUsingEncoding(NSUTF8StringEncoding)! 

의해 생성이다 NUL 문자 메시지 문자열의 종단를 포함하고, 그뿐만 아니라 UInt(cData.count)에서 계산된다. 대신 UInt(strlen(cData))을 사용하여 Objective-C 코드와 마찬가지로 을 수정할 수 있습니다. 스위프트 오브젝티브 C 코드는 동일한 메시지 다이제스트를 생성이 변형

let cKey = RestUtils.API_KEY.dataUsingEncoding(NSASCIIStringEncoding)! 
let cData = message.dataUsingEncoding(NSUTF8StringEncoding)! 

var cHMAC = [CUnsignedChar](count: Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0) 
CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA1), cKey.bytes, UInt(cKey.length), cData.bytes, UInt(cData.length), &cHMAC) 

:

하지만 더 나은 솔루션 대신 NSData 개체 입력 문자열 변환한다.

+0

테스트 결과 해시는 여전히 다릅니다. Swift (6670b90fe993291b741e4ce7905deb0811fec084) 및 obj-c (d80b816f0b46d5211b6d9487089597e181717ea6)는 동일한 입력을 갖고 있습니다. –

+0

@artworkad シ : 결과가 다른 곳에서 구체적인 키와 메시지를 줄 수 있습니까? 그러면 문제를 찾을 수 있습니다. - 나는 key = "key"와 message = "message"로 테스트했고 동일한 결과를 얻었다. 2088df74d5f2146b48146caf4965377e9d0be3a4. - 키에 NUL 문자가 포함되어있을 가능성이 있습니까? –

+0

문제가 발견되었습니다. cKey에 문제가 있습니다. 내가 cKey = "test"를 설정할 때 나는 같은 해쉬를 얻는다. 그러나 cKey = "a32d2 ... f25"(길이는 96)를 설정하면 다른 해시를 얻지 만 cKey는 코드의 obj-c 버전과 동일한 값을 갖습니다. 아이디어가 있습니까? –