【发布时间】: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