【问题标题】:Crash when signing with RSA/SHA-1使用 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文件,但我没有,我该怎么办,请在这里指导我。

标签: ios objective-c openssl keychain


【解决方案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);
猜你喜欢
  • 1970-01-01
  • 2014-07-26
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
相关资源
最近更新 更多