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方法。任何想法的問題是?
測試過它,哈希值依然不同。 Swift(6670b90fe993291b741e4ce7905deb0811fec084)和obj-c(d80b816f0b46d5211b6d9487089597e181717ea6),同時具有相同的輸入。 – 2014-11-01 11:30:11
@artworkadシ:你能給出一個結果不同的具體的關鍵和消息嗎?然後我可以嘗試找到問題。 - 我用key =「key」和message =「message」對它進行了測試,得到了相同的結果2088df74d5f2146b48146caf4965377e9d0be3a4。 - 也許關鍵是嵌入了NUL字符? – 2014-11-01 11:32:03
我發現了這個問題。 cKey有一個問題。當我設置cKey =「test」時,我得到相同的散列。然而,當我設置cKey =「a32d2 ... f25」(長度爲96)時,我得到了不同的散列值,但cKey對於代碼的swift和obj-c版本具有相同的值。你有好主意嗎? – 2014-11-01 11:39:49