ios - iOS 中的 SecKeyRawVerify 收到误报

标签 ios objective-c

我正在使用 RSASHA-256 签署 JWT 并尝试在我的 iOS SDK 上验证它。

发送完整数据时,验证通过。

但是,当篡改收到的数据时,我仍然收到误报。

在此处添加代码:

//
//  NSData+VerifySignature.m
//  InsertFramework
//
//  Created by yaniv1 on 1/13/16.
//  Copyright © 2016 Insert. All rights reserved.
//

#import "NSData+VerifySignature.h"
#import "IIOStringEncoder.h"
#import "IIOLog.h"
#import "IIORSA.h"

@implementation NSData (VerifySignature)

-(NSArray *)createComponents{
    NSString *data =[[NSString alloc] initWithData:self    encoding:NSUTF8StringEncoding];
NSArray *components = [data componentsSeparatedByString:@"."];
if (!components || [components count] != 3) {
    IIOErrorLog(@"Invalid JWT received for verification");
    return nil;
}

return components;
}

-(NSData *)verifySignature:(NSHTTPURLResponse *)urlResponse {

//Getting response header content-type and checking if it is jwt
NSString *contentType = [[[urlResponse allHeaderFields][@"Content-Type"] componentsSeparatedByString:@";"] objectAtIndex:0];

if (![contentType isEqualToString:@"insert/jwt"])
{
    return nil;
}

NSArray *signatureComponents = [self createComponents];
if (!signatureComponents) {
    return nil;
}

//JWT is seperated into his 3 components
NSString *header = signatureComponents[0];
NSString *payload = signatureComponents[1];
NSString *signature = signatureComponents[2];

//Turining signature received in base64 to base64UrlEncoded
NSData *base64UrlEncodedSig = [IIOStringEncoder dataWithBase64UrlEncodedString:signature];

SecKeyRef pKey = [IIORSA addPublicKey];
if (!pKey) {
    IIOErrorLog(@"Failed to create public key, which results in verification failure");
    return nil;
}

//Creating the data to verify the signature, meaning the header.payload
NSString *headerAndPayload = [[header stringByAppendingString:@"."] stringByAppendingString:payload];
NSData *dataHeaderAndPayload = [headerAndPayload dataUsingEncoding:NSUTF8StringEncoding];

//Verify the signature. For further details, go to
BOOL status = SecKeyRawVerify (pKey,
                      kSecPaddingPKCS1SHA1,
                      (const uint8_t *)[dataHeaderAndPayload bytes],
                      (size_t)[dataHeaderAndPayload length],
                      (const uint8_t *)[base64UrlEncodedSig bytes],
                      (size_t)[base64UrlEncodedSig length]
                      );

if (!status) {
    IIOErrorLog(@"Failed to verify signature");
    return nil;
}

NSData *payloadDecodedData = [[NSData alloc]   initWithBase64EncodedString:payload options:0];

    return payloadDecodedData;
}

@end

有人可以建议吗?

最佳答案

该方法不返回 BOOL。查看reference :

OSStatus SecKeyRawVerify(SecKeyRef key,
    SecPadding padding,
    const uint8_t *signedData,
    size_t signedDataLen,
    const uint8_t *sig,
    size_t sigLen);

关于ios - iOS 中的 SecKeyRawVerify 收到误报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34763884/

相关文章:

objective-c - 核心情节: unable to get legend titles in barchart

iphone - FlipView 关闭后如何刷新 View

ios - 当用户向下滚动时, Material float 操作按钮应不可见,向上滚动时应可见

objective-c - FSEvents - 找出目标目录中发生了什么变化

objective-c - 线程嵌套 for 循环

objective-c - 如何在 macbook pro(Intel 64 位处理器)上用 C 语言演示内存错位错误

ios - 导航应用程序失败 ios 9

javascript - jquery smartbanner 没有苹果 smartbanner

ios - 如何在表格 View 中搜索时更新图片

iphone - 什么是 key 以及如何使用它们?