2014-11-01 77 views
0

我有兩種方法可以從一個字符串中創建一個sha1哈希。使用相同的輸入數據,該算法會創建不同的哈希值,但它們應該創建相同的哈希值。obj-c和swift中的相同HMAC算法創建不同的哈希

在迅速(創建617fb90f14f2eacecc333d558237bf8bb9fc85f7):

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(創建d80b816f0b46d5211b6d9487089597e181717ea6)

+(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方法。任何想法的問題是?

回答

2

其原因是,通過cData

let cData = message.cStringUsingEncoding(NSUTF8StringEncoding)! 

創建包括終止NUL字符消息字符串的和在 UInt(cData.count)計數爲好。你可以使用UInt(strlen(cData))來代替 ,如你的Objective-C代碼。

但更好的解決方案是將輸入字符串 轉換爲NSData對象,而不是:

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) 

有了這個修改,夫特和Objective-C代碼產生相同消息摘要。

+0

測試過它,哈希值依然不同。 Swift(6670b90fe993291b741e4ce7905deb0811fec084)和obj-c(d80b816f0b46d5211b6d9487089597e181717ea6),同時具有相同的輸入。 – 2014-11-01 11:30:11

+0

@artworkadシ:你能給出一個結果不同的具體的關鍵和消息嗎?然後我可以嘗試找到問題。 - 我用key =「key」和message =「message」對它進行了測試,得到了相同的結果2088df74d5f2146b48146caf4965377e9d0be3a4。 - 也許關鍵是嵌入了NUL字符? – 2014-11-01 11:32:03

+0

我發現了這個問題。 cKey有一個問題。當我設置cKey =「test」時,我得到相同的散列。然而,當我設置cKey =「a32d2 ... f25」(長度爲96)時,我得到了不同的散列值,但cKey對於代碼的swift和obj-c版本具有相同的值。你有好主意嗎? – 2014-11-01 11:39:49