gpt4 book ai didi

ios - obj-c 和 swift 中相同的 HMAC 算法创建不同的哈希值

转载 作者:行者123 更新时间:2023-11-28 05:33:13 25 4
gpt4 key购买 nike

我有两种从字符串创建 sha1 散列的方法。使用相同的输入数据,这些算法会创建不同的哈希值,但是它们应该创建相同的哈希值。

在 swift 中(创建 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;
}

我希望 swift 方法返回与 obj-c 方法相同的散列。知道问题出在哪里吗?

最佳答案

原因是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)

通过这种修改,Swift 和 Objective-C 代码生成相同的消息摘要。

关于ios - obj-c 和 swift 中相同的 HMAC 算法创建不同的哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26688043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com