使用 RSA/SHA-1 签名时崩溃

Posted

技术标签:

【中文标题】使用 RSA/SHA-1 签名时崩溃【英文标题】:Crash when signing with RSA/SHA-1 【发布时间】:2015-06-02 11:18:36 【问题描述】:

我正在使用下面的代码用私钥唱字符串。

我在 iPhone 钥匙串中有私钥。现在在钥匙串中获取私钥并传递给 PEM_read_RSAPrivateKey:

- (NSString *)RSASHA1HashForString:(NSString *)source 

    KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc]
                                         initWithIdentifier:@"TestKeychain"
                                         accessGroup:@"keys"];       

    if (source == nil) return nil;

    OpenSSL_add_all_algorithms();

    NSString *signature = nil;

    // make a SHA-1 digest of the source string
    const char* sourceChars = [source UTF8String];

    unsigned char digest[SHA_DIGEST_LENGTH];
    SHA1((const unsigned char *)sourceChars, strlen(sourceChars), digest);        

    FILE *secretFile;
    RSA *rsa = NULL;
    @try 
        NSData *privateKeyFileData = [keychainItem objectForKey:(__bridge id)kSecAttrLabel];

        secretFile = (__bridge FILE *)(privateKeyFileData);

        PEM_read_RSAPrivateKey(secretFile, &rsa, NULL, NULL);
    
    @catch (NSException *exception) 
        NSLog(@"Error %@",[exception description]);
    

    if (rsa != NULL) 

        unsigned int sigLen = 0;
        unsigned char *sigBuff = malloc(RSA_size(rsa));

        int result = RSA_sign(NID_sha1, digest, (unsigned int) sizeof(digest),
                              sigBuff, &sigLen, rsa);

        if (result != 0) 
            NSData *sigData = [NSData dataWithBytes:sigBuff length:sigLen];
            signature = [self base64forData:sigData];                
        

        free(sigBuff);            
        RSA_free(rsa);
    

    return signature;


但它在下面的代码中崩溃了,

FILE *secretFile;
RSA *rsa = NULL;
@try 
    NSData *privateKeyFileData = [keychainItem objectForKey:(__bridge id)kSecAttrLabel];

    secretFile = (__bridge FILE *)(privateKeyFileData);

    PEM_read_RSAPrivateKey(secretFile, &rsa, NULL, NULL);

有什么办法可以解决这个问题,我没有 PEM 文件,我在 Keychain 中有私钥。

【问题讨论】:

你正在“崩溃”!?知道这很有趣——更有趣的是,确切的崩溃原因会是什么!以及例如行号... 我在 PEM_read_RSAPrivateKey(secretFile, &rsa, NULL, NULL); “有什么办法可以解决这个问题,我没有 PEM 文件,我在钥匙串中有私钥。” - 这是另一个问题(而且它非常好问题,因为代码很重要)。它包括 (1) 从钥匙串中获取项目; (2) 从字典中检索各种参数,然后放入RSA,然后 (3) 签名。 我正在实现 SSO 概念,所以我的父应用程序创建公钥和私钥并存储在钥匙串中,钥匙串是共享的,所以每个 SSO 都启用应用程序访问公钥和私钥,现在我有字符串一种令牌,所以令牌会签署私钥,它位于钥匙串中,但上述方法需要.PEM文件,但我没有,我该怎么办,请在这里指导我。 【参考方案1】:
PEM_read_RSAPrivateKey(secretFile, &rsa, NULL, NULL);

试试:

rsa = PEM_read_RSAPrivateKey(privateKeyFile, NULL, NULL, NULL);

// make a SHA-1 digest of the source string
const char* sourceChars = [source UTF8String];

这不是必需的。 RSA_sign 将为您消化数据。

【讨论】:

你好,仍然在这一行崩溃 rsa = PEM_read_RSAPrivateKey(privateKeyFile, NULL, NULL, NULL);

以上是关于使用 RSA/SHA-1 签名时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

签名的 apk 在 proguard enable 中崩溃

Xcode5 GM 崩溃,“没有可用于签名的身份”然后崩溃

开发人员 ID 签名的 OS X 应用程序在启动时因代码签名无效而崩溃

如何在使用 minifyenabled true 构建签名 apk 时限制应用程序崩溃,意味着应用程序?

为啥我的签名 apk 崩溃了?

签名发布后尝试调试时 Flutter android App 崩溃