首页 > 解决方案 > API 不接受 SHA1 哈希

问题描述

我正在开发一个使用条形码从 API 中提取数据的应用程序。

对于每个调用,我需要生成一个哈希值作为签名。这是我的 API ID 和条形码的组合。我遇到了一个问题,我的哈希值每次都相同,因此我的调用失败了。

创建哈希的函数在 Objective-C 中,我有一个桥,所以我可以在 SwiftUI 中调用它。

NSString+SHA1.m

#import "NSString+SHA1.h"
#import <CommonCrypto/CommonHMAC.h>

@implementation NSString (SHA1)

- (NSString *)hashedValue:(NSString *)key
{
    const char *cKey  = [key cStringUsingEncoding:NSUTF8StringEncoding];
    const char *cData = [self cStringUsingEncoding:NSUTF8StringEncoding];
    
    unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
    
    NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
    
    NSString *hash = [HMAC base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

    //Used to be [HMAC base64Encoding], but is now depreciated
    
    return hash;
}

@end

由于 base64Encoding 已被贬值,我尝试改用 base64EncodedStringWithOptions。这可能是错误的,并且可能是为什么我的哈希值每次都相同的原因。

这就是我在 SwiftUI 中的称呼:

 let hashedValue = scannedCode.barcode.hashedValue("(API ID)")

扫描代码是一个可观察对象,它将扫描的条形码作为字符串存储在“条形码”下。

在桥接头中:

#import "NSString+SHA1.h"
#import "NSString+SHA1.m"

NSString+SHA1.h

#import <Foundation/Foundation.h>

@interface NSString (SHA1)

- (NSString *)hashedValue:(NSString *)key;

@end

编辑:

我修复了哈希值相同的问题,但 API 仍然不接受我的签名。所以这与计算错误有关。

标签: iosobjective-cswifthash

解决方案


推荐阅读