문자열에서 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를 생성) . 문제가있는 아이디어가 있습니까?
테스트 결과 해시는 여전히 다릅니다. Swift (6670b90fe993291b741e4ce7905deb0811fec084) 및 obj-c (d80b816f0b46d5211b6d9487089597e181717ea6)는 동일한 입력을 갖고 있습니다. –
@artworkad シ : 결과가 다른 곳에서 구체적인 키와 메시지를 줄 수 있습니까? 그러면 문제를 찾을 수 있습니다. - 나는 key = "key"와 message = "message"로 테스트했고 동일한 결과를 얻었다. 2088df74d5f2146b48146caf4965377e9d0be3a4. - 키에 NUL 문자가 포함되어있을 가능성이 있습니까? –
문제가 발견되었습니다. cKey에 문제가 있습니다. 내가 cKey = "test"를 설정할 때 나는 같은 해쉬를 얻는다. 그러나 cKey = "a32d2 ... f25"(길이는 96)를 설정하면 다른 해시를 얻지 만 cKey는 코드의 obj-c 버전과 동일한 값을 갖습니다. 아이디어가 있습니까? –