首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在iOS中用公钥验证数字签名

在iOS中用公钥验证数字签名
EN

Stack Overflow用户
提问于 2013-03-21 19:26:59
回答 4查看 5.1K关注 0票数 5

如何在不使用任何第三方代码的情况下在iOS中使用公钥验证数字签名(例如)打开SSL?

我需要用公钥验证iOS应用程序中的数字签名。有人能帮我实现这一点而不用第三方软件吗?

我正在尝试下面的代码,但问题是我的应用程序中没有证书,所以无法创建SecTrustRef。

代码:

代码语言:javascript
复制
    NSString *certPath              = [[NSBundle mainBundle] pathForResource:@"yyy" 
                                                             ofType:@"xxx"];
    SecCertificateRef myCertificate = nil;
    NSData *certificateData         = [[NSData alloc] initWithContentsOfFile :certPath];
    myCertificate                   = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)certificateData);

    SecPolicyRef myPolicy           = SecPolicyCreateBasicX509();
    SecTrustRef trustRef;
    SecTrustCreateWithCertificates(myCertificate, myPolicy, &trustRef);
    SecKeyRef keyRef      = SecTrustCopyPublicKey (trustRef);


    BOOL status = SecKeyRawVerify (keyRef,
                              kSecPaddingPKCS1SHA1,
                              (const uint8_t *)[data bytes],
                              (size_t)[data length],
                              (const uint8_t *)[signature bytes],
                              (size_t)[signature length]
                              );

我有以下几点:

  • 公钥(NSString*)
  • 签署(NSString*)
  • 数据(NSString*)

如果我不想使用ant第三方开源,请帮助我在iOS SDK中的所有选项。

EN

回答 4

Stack Overflow用户

发布于 2013-10-08 10:22:33

您可以将您的公钥打包到X509证书中,以便使用内置于函数中的iOS,使用openSSL:

代码语言:javascript
复制
openssl req -x509 -out public_key.pem -outform pem -new -newkey rsa:2048 -keyout private_key.pem 

PEM格式是base64编码的,您可以将-outform切换到DER以获得二进制文件。您可以通过向您的程序添加一个const NSString并使用以下函数将类别添加到NSData中,从而导入PEM格式:

代码语言:javascript
复制
- (id) initWithBase64EncodedString:(NSString *) string {
    NSMutableData *mutableData = nil;

    if( string ) {
        unsigned long ixtext = 0;
        unsigned long lentext = 0;
        unsigned char ch = 0;
        unsigned char inbuf[4], outbuf[3]; // buffer sizes fixed by AOL LLC
        short i = 0, ixinbuf = 0;
        BOOL flignore = NO;
        BOOL flendtext = NO;
        NSData *base64Data = nil;
        const unsigned char *base64Bytes = nil;

        // Convert the string to ASCII data.
        base64Data = [string dataUsingEncoding:NSASCIIStringEncoding];
        base64Bytes = [base64Data bytes];
        mutableData = [NSMutableData dataWithCapacity:[base64Data length]];
        lentext = [base64Data length];

        while( YES ) {
            if( ixtext >= lentext ) break;
            ch = base64Bytes[ixtext++];
            flignore = NO;

            if( ( ch >= 'A' ) && ( ch <= 'Z' ) ) ch = ch - 'A';
            else if( ( ch >= 'a' ) && ( ch <= 'z' ) ) ch = ch - 'a' + 26;
            else if( ( ch >= '0' ) && ( ch <= '9' ) ) ch = ch - '0' + 52;
            else if( ch == '+' ) ch = 62;
            else if( ch == '=' ) flendtext = YES;
            else if( ch == '/' ) ch = 63;
            else flignore = YES;

            if( ! flignore ) {
                short ctcharsinbuf = 3;
                BOOL flbreak = NO;

                if( flendtext ) {
                    if( ! ixinbuf ) break;
                    if( ( ixinbuf == 1 ) || ( ixinbuf == 2 ) ) ctcharsinbuf = 1;
                    else ctcharsinbuf = 2;
                    ixinbuf = 3;
                    flbreak = YES;
                }

                inbuf [ixinbuf++] = ch;

                if( ixinbuf == 4 ) {
                    ixinbuf = 0;
                    outbuf [0] = ( inbuf[0] << 2 ) | ( ( inbuf[1] & 0x30) >> 4 );
                    outbuf [1] = ( ( inbuf[1] & 0x0F ) << 4 ) | ( ( inbuf[2] & 0x3C ) >> 2 );
                    outbuf [2] = ( ( inbuf[2] & 0x03 ) << 6 ) | ( inbuf[3] & 0x3F );

                    for( i = 0; i < ctcharsinbuf; i++ )
                        [mutableData appendBytes:&outbuf[i] length:1];
                }

                if( flbreak )  break;
            }
        }
    }

    self = [self initWithData:mutableData];
    return self;
}

当然,如果您想使用您现有的公钥,可以将该文件拉到certificateData中,只需使用openSSL将其取出并以X509证书格式写入它。

代码语言:javascript
复制
$ openssl rsa -in id_rsa -out pub.der -outform DER -pubout

祝好运

票数 1
EN

Stack Overflow用户

发布于 2013-03-21 19:47:55

如果您的密钥数据打包为PKCS12数据,则使用SecPKCS12Import导入它并使用公钥。

票数 0
EN

Stack Overflow用户

发布于 2014-01-23 16:26:37

您需要将数据的摘要(散列)传递给验证函数。请参阅iOS: Verifying a File With a Certificate and Signature - Public Key is Wrong, Verification Fails

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15556375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档