Ios 使用RSA/SHA-1签名时崩溃
我使用下面的代码来生成带有私钥的字符串 我在iPhone钥匙链中有私钥。现在,在钥匙链中获取私钥并将其传递到PEM_read_RSAPrivateKey:Ios 使用RSA/SHA-1签名时崩溃,ios,objective-c,openssl,keychain,Ios,Objective C,Openssl,Keychain,我使用下面的代码来生成带有私钥的字符串 我在iPhone钥匙链中有私钥。现在,在钥匙链中获取私钥并将其传递到PEM_read_RSAPrivateKey: - (NSString *)RSASHA1HashForString:(NSString *)source { KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initW
- (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文件,我的钥匙链中有私钥
尝试:
这是不必要的
RSA\u-sign
将为您消化数据。您正在“崩溃”!?这很有趣,但更有趣的是,确切的崩溃原因是什么!以及行号,例如…我在PEM_read_RSAPrivateKey(secretFile,&rsa,NULL,NULL)行上遇到崩溃;“有没有办法解决这个问题,我没有PEM文件,我的钥匙链中有私钥。”-这是另一个问题(这是一个非常好的问题,因为代码非常重要)。它包括(1)从钥匙链中取出物品;(2) 从字典中检索各种参数,然后放入RSA
,然后(3)签名。我正在实施SSO概念,因此我的父应用程序创建公钥和私钥并存储在密钥链中,并且密钥链是共享的,因此每个SSO使用程序能够访问公钥和私钥,现在我有了字符串类型的令牌,所以令牌将对私钥进行签名,私钥位于keychain中,但上面的方法是必需的.PEM文件,但我没有,我应该做什么,请在这里为我提供guid。您好,这行仍然崩溃rsa=PEM_read_RSAPrivateKey(privateKeyFile,NULL,NULL,NULL);
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];