簡體   English   中英

來自iOS中X.509 ASN.1 RSA公鑰的SecKeyRef

[英]SecKeyRef from X.509 ASN.1 RSA Public Key in iOS

我意識到我在Stack Overflow上已經提出的問題有很多類似的問題,但是沒有一個問題能夠得到真正滿足我需求的明確答案,所以我們開始:

我的程序通過網絡接收ASN.1編碼的RSA公鑰。 我將數據存儲在一個簡單的NSData實例中。 我希望使用該公鑰來編碼16個字節的數據並通過網絡返回這些數據。 根據我的研究,最好的方法是使用SecKeyRef。 根據Apple提供的荒謬模糊的文檔,可以使用一些代碼來完成。 但是,他們的代碼存在問題。 每次我想使用公鑰時,我都需要將其添加到鑰匙串並為其提供唯一標識符。 這個問題是這個密鑰只能使用一次 我正在尋找一種方法來獲取一個不在鑰匙串中的密鑰的SecKeyRef,並從ASN.1編碼密鑰創建。

我還考慮過通過base64編碼將它轉換為普通PEM的可能性,並將其包裝在'----- BEGIN PUBLIC KEY -----'和'----- END PUBLIC KEY ----- '然后將它加載到SecKeyRef中,但我還沒有看到這樣做的方法。

此外,我沒有太多關鍵,鍵格式等類型的選擇。它來自第三方java服務器。 好極了。

我目前有這種加載密鑰的替代方法(可能)不會將它們添加到密鑰鏈,但密鑰顯然(通過反復試驗:D)不是DER格式,因此我不能像這樣加載它。

SecCertificateRef certificateRef = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)data); //data contains the public key - received over the network
SecPolicyRef policyRef = SecPolicyCreateBasicX509();
SecTrustRef trustRef;

OSStatus status = SecTrustCreateWithCertificates(certificateRef, policyRef, &trustRef);
NSAssert(status == errSecSuccess, @"SecTrustCreateWithCertificates failed.");

SecTrustResultType trustResult;
status = SecTrustEvaluate(trustRef, &trustResult);
NSAssert(status == errSecSuccess, @"SecTrustEvaluate failed.");

SecKeyRef publicKey = SecTrustCopyPublicKey(trustRef); //The Result :)
NSAssert(publicKey != NULL, @"SecTrustCopyPublicKey failed.");

if (certificateRef) CFRelease(certificateRef);
if (policyRef) CFRelease(policyRef);
if (trustRef) CFRelease(trustRef);

PS:為什么蘋果這么難? 靜態鏈接OpenSSL很容易,但隨后出現各種出口法規和其他問題。

問題顯然是“證書”的來源,它實際上並不比一些DER標簽包含的密鑰多得多。

http://blog.wingsofhermes.org/?p=75博客文章中,由於黑魔法,我已經成功地實現了我的大部分目標。

成功:

  • 從數據加載的密鑰,而不是文件
  • java服務器成功讀取的密鑰加密(AES)密鑰。

不太成功:

  • 不得不使用唯一標識符,但我重用它,所以不需要瘋狂的命名方案。
  • 密鑰暫時添加到鑰匙串,但我在一次使用后將其刪除,因此也可以解決。

我仍然不太清楚if語句的數組與循環和魔法數字的數量完全相同,但至少它是有效的,因為密鑰總是來自同一個源,它不應該破壞,除非他們改變了java安全提供程序......哦等等,這實際上有點可能......哦......至少它在Java 7標准中有點具體。

*交叉手指* *希望沒有任何打破*

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM