0

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"];

価値があるでしょう!私はこのコードを自分で書くことを恐れていませんが、正しい方向に少しずつ進んでいただければ幸いです:-)

4

0 に答える 0