2013-05-09 34 views
1

我是Macintosh開發新手。我有NSData + connection.m文件。此文件具有更多不推薦使用的功能,如BIO_newBIO_writeBIO_get_mem_data等。這些功能都會遇到不建議使用的錯誤。如何解決這個錯誤'BIO_new'在可可中被棄用?

- (NSString *)base64Encoding 
{ 
    BIO * mem = BIO_new(BIO_s_mem()); 
    BIO * b64 = BIO_new(BIO_f_base64()); 
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); 
    mem = BIO_push(b64, mem); 

    BIO_write(mem, [self bytes], [self length]); 
    BIO_flush(mem); 

    char * base64Pointer; 
    long base64Length = BIO_get_mem_data(mem, &base64Pointer); 

    NSString * base64String = [NSString stringWithCString:base64Pointer 
               length:base64Length]; 

    BIO_free_all(mem); 
    return base64String; 
} 

請幫幫我。

+3

這是Mac,而不是MAC。後者或者意味着強制訪問控制或媒體訪問控制取決於上下文。 – alastair 2013-05-09 13:00:01

+0

好的,謝謝alastair。 – 2013-05-09 13:19:05

+0

Apple棄用OpenSSL以支持其CoreCrypto(我相信它是CoreCrypto)。蘋果開發者留言板上有一個關於它的線索。我認爲這個討論在2012年左右的WWDC開發者大會上就沒有了。當時的討論並未公開 - 它隱藏在NDA之下。 – jww 2014-08-12 17:53:42

回答

4

Apple已棄用的是使用 OpenSSL頭和他們的 OpenSSL動態庫。原因是OpenSSL的界面即使在次要版本之間也會以不兼容的方式發生變化,因此很難及時更新錯誤修正和安全更新,而不會破壞客戶端代碼。

可以做什麼(以及我過去做過的)是grab OpenSSL yourself,請使用該版本的功能並將其捆綁到您的應用程序中。

+0

謝謝格雷厄姆李。我正在使用OSX 10.8.3。 – 2013-05-09 12:24:52

+0

當然,如果您自己發佈OpenSSL,則如果其中一個漏洞影響到您,則需要發佈應用程序更新。 – alastair 2013-05-09 13:30:08

+0

@alastair是真實的,但如果您自己不運送OpenSSL,則可以利用Apple不提供給您的更新:) – 2013-05-09 13:41:45

3

如果您的應用程序面向Mac OS X 10.7或更高版本,則可以使用SecTransform來代替。值得注意的是,base64有很多變體(the Wikipedia article列表不少於13個),這可能會讓你對使用其他人的實現保持警惕,除非他們正確地記錄他們的行爲(IMO既OpenSSL和SecTransform失敗在他們的文檔中完全指定他們的行爲)。

0

如何解決這個錯誤'BIO_new'在可可不推薦使用?

您可以通過使用蘋果版的OpenSSL位於/usr/include/usr/lib解決這個問題。它的舊版本 - 0.9.8 - 所以它缺少一些功能。它的損失不會被錯過。

相反,您應該下載,構建並安裝最新版本的OpenSSL。你可以從OpenSSL: Source, Tarballs下載它。

配置如下(在OpenSSL wiki上有更全面的選項列表,其編號爲Configure Options)。

$ export KERNEL_BITS=64 
$ ./config no-ssl2 enable-ec_nistp_64_gcc_128 --openssldir=/usr/local 
$ make all 
$ sudo make install 

--openssldir=/usr/local意味着/usr/local/ssl將用於安裝的基本目錄。

以後,當您編譯和鏈接,請執行以下操作:

  • 添加/usr/local/ssl/include ANS頭搜索路徑(即-I選項)
  • 添加/usr/local/ssl/lib ANS庫搜索路徑(即一-L選項)

如果您使用-L,那麼一定要使用DYLD_LIBRARY_PATH時executi你的程序。它就像在Linux上的LD_PRELOAD一樣。如果您不使用DYLD_LIBRARY_PATH,則dyld將加載位於/usr/lib中的舊版0.9.8版OpenSSL;而不是位於/usr/local/ssl/lib/中的更新後的1.0.1版OpenSSL。

更好的是,省略-L並指定完整的庫路徑。

  • /usr/local/ssl/lib/libssl.a
  • /usr/local/ssl/lib/libcrypto.a

這樣你就不需要擔心-LDYLD_LIBRARY_PATH。事情只是按預期工作。