RSA を使用して、Web サービスに渡す必要がある HTTP ヘッダー内のトークンに署名しようとしています。要件は、自分の秘密鍵を使用して暗号化し、公開鍵を与えることです。これは純粋に使用されるので、メッセージが私から送信されたことを確認してください。
私はSOに関する多くの同様の質問を認識していますが、今朝これまでに多くの試みを行ってきましたが、些細なことだと思っていたものにはまだ近づいていません.
RSA を使用し、公開鍵を使用して暗号化する例はたくさんありますが、私の要件は、秘密鍵で署名することです。
Apple のサンプル セキュリティ コードとそれを借用した他のほとんどのサンプルは、(最初の試みから) キーチェーンを使用して常に秘密/公開キーのペアを生成しているように見えます - クライアントに公開キーを配布できるように、OpenSSL を使用してキーを生成することをお勧めします.
いくつかのキーを生成することができました。このコードを使用して秘密キーをロードできるようです (申し訳ありませんが、何時間も実装を混ぜ合わせていたため、ソースを思い出すことができません)。
-(SecKeyRef) getPrivateKeyRef {
NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"rsaPrivate" ofType:@"p12"];
NSData *p12Data = [NSData dataWithContentsOfFile:resourcePath];
NSMutableDictionary * options = [[NSMutableDictionary alloc] init];
SecKeyRef privateKeyRef = NULL;
//change to the actual password you used here
[options setObject:@"xxxx" forKey:(__bridge id)kSecImportExportPassphrase];
CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);
OSStatus securityError = SecPKCS12Import((__bridge CFDataRef) p12Data,
(__bridge CFDictionaryRef)options, &items);
if (securityError == noErr && CFArrayGetCount(items) > 0) {
CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0);
SecIdentityRef identityApp = (SecIdentityRef)CFDictionaryGetValue(identityDict,
kSecImportItemIdentity);
securityError = SecIdentityCopyPrivateKey(identityApp, &privateKeyRef);
if (securityError != noErr) {
privateKeyRef = NULL;
}
}
CFRelease(items);
return privateKeyRef;
}
有効な を返すようですSecKeyRef
が、これを使用して署名する方法がわかりませんNSString
。
この問題に取り組むには非常に多くの方法があるようです (OpenSSL をビルドしてそれにリンクする、Apple のキーチェーン メソッドを使用する、GitHub で部分的に完成したライブラリを使用する) が、私は行き止まりに達し続けています。これに対する解決策。
次のようなもの:
NSString* signedString = [rsaHelper signString: @"Hello, World!" WithPrivateKey:@"rsaPrivate.p12"];
公開鍵で暗号化された文字列を指定すると、次のようになります。
NSString* decryptedString = [rsaHelper decryptString: @"DK5tkgkfjkJJft=" WithPrivateKey:@"rsaPrivate.p12"];
価値があるでしょう!私はこのコードを自分で書くことを恐れていませんが、正しい方向に少しずつ進んでいただければ幸いです:-)