使用 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 签名时崩溃的主要内容,如果未能解决你的问题,请参考以下文章
开发人员 ID 签名的 OS X 应用程序在启动时因代码签名无效而崩溃