openssl移植Android使用及其相關經驗分享

來源:互聯網
上載者:User

1.      linux安裝openssl庫

參見《精通PKI網路安全認證技術與編程實現》2.3.2節 Linux下搭建OpenSSL開發環境

Linux下面解壓tar.bz2檔案:tar jxvf  android-ndk-r5c-linux-x86.tar.bz2

 

2.      配置NDK的環境變數

在~/.bashrc檔案末尾添加:
NDK=~/android-ndk-r4b
export NDK

 

執行source ~/.bashrc

如果有終端已經運行,需要在重啟終端才能使用NDK變數

3.      JNI介紹

JNI主要功能就是能夠調用到C庫,在這裡我們需要用C或C++調用openssl庫實現加密簽名等功能,然後編譯成arm體系的so庫,用java調用提供的介面。

詳細介紹參見此書:《TheJava Native Interface: Programmer’s Guide and Specification》

4.      下載android版本的openssl,編譯

現在網上我看見過3種版本的android-openssl,fries版本,eighthave版本以及guardianproject版本,前面兩個版本有測試過但是沒有嘗試成功,guardianproject版本編譯成靜態庫再給android的JNI動態庫程式調用的話會找不到方法,不清楚是什麼原因,但是直接將JNI程式與openssl工程一起編譯就可以實現。

下面這個blog有說編譯openssl靜態庫給android用,但是不知道他用的是什麼版本的Openssl,我按照他的方法嘗試沒有成功。

http://blog.csdn.net/someonea/article/details/6312213

 

guardianproject版本原版:

https://github.com/guardianproject/openssl-android

我修改過的版本:

http://download.csdn.net/source/3408214

在我修改過的版本中可以直接在myAPP檔案夾下編寫JNI程式,與Openssl一起打包編譯成動態庫就行了。

編譯時間可能出現一些undefined reference,大部分可能是沒有添加連結庫,有些情況也可能是NDK版本問題,最好用最新版本的NDK(我用的r5c),注意有沒添加以下兩個靜態庫

LOCAL_LDLIBS := -lz –ldl

註明下:如果是下的本人修改的openssl源碼,使用android-8的版本,在本人上傳的openssl源碼中default.properties可以更改版本

5.      將編譯完的so庫放置android工程目錄的libs/armeabi目錄下

6.      JAVA調用動態庫

下面是本人測試時寫的一個兩數相加的:

native方法:public native int add(int a,int b); load庫:     static {        System.loadLibrary("add");//編譯完的都是帶Lib開頭的,這裡Load不要加}

7.      在c程式中調用android的log,記錄運行資訊

表示完全不會用gdb調試這玩意,只好用log一步步記錄了…..

#include<android/log.h>#define LOG_TAG"show infomation"   //這個是log標籤,內容自己設定#define LOGW(a) __android_log_write(ANDROID_LOG_WARN,LOG_TAG,a)  //除了這個方法還有__android_log_print方法,跟printf很像,具體可以看android/log.h裡面Makefile中LOCAL_LDLIBS:=  -L$(SYSROOT)/usr/lib –llog

 

8.      bouncyCastle結合openssl進行密鑰管理

參見這個部落格的介紹

http://blog.csdn.net/zhenyongyuan123/article/details/5558562

本人已經嘗試成功用bouncyCastle在android上產生密鑰庫和金鑰組,


這裡需要注意的是Android上本身有bouncyCastle包,如果直接匯入包會在運行時報找不到類等錯誤

我們需要下載bouncyCastle源碼,修改包名比如org.bouncyCastle2等,編譯打包成jar


Build Path->Add External Archives添加包,不然運行時也會報找不到類錯誤,這個可能是因為沒有將jar包打入apk中。


9.      openssl與cryptoAPI對稱式加密的相容問題

cryptoAPI本身不支援傳清除金鑰進去,需要通過genKey或者DeriveKey得到Key控制代碼,

而這裡面不僅僅只是對傳進去的密鑰進行hash演算法,具體可參見MSDN

http://msdn.microsoft.com/en-us/library/aa379916%28v=VS.85%29.aspx

Remarks裡面的

If the hash is not a member of the SHA-2 family and therequired key is for either 3DES or AES, the key is derived as follows:下面六個步驟。

我們可以通過公開金鑰加密,私密金鑰解密查看到cryptoAPI進行對稱式加密的工作階段金鑰,這裡已經有完整的代碼:

http://www.codeproject.com/KB/security/plaintextsessionkey.aspx

在使用openssl的evp封裝好的對稱式加密時貌似有點問題,可能是我使用錯了,使用下面這種方式可以與cryptoAPI的加密匹配上

http://blog.csdn.net/lyjinger/article/details/1722570

10.  有些時候可能只需要NDK編譯出靜態庫,但是如果不加上動態庫會什麼都不編譯

這裡只編譯靜態庫需要在JNI下面建立一個Application.mk,需要在該檔案中加上一句:

APP_MODULES := libexample(模組名稱)

 

11.  另外,Android上面有一個認證安裝的功能,沒有真機,不瞭解什麼用途,

在android模擬器的setting裡面可以找到Location&security欄,裡面可以install from SD card安裝加密的認證,p12格式的,帶私密金鑰的。安裝後可以在Data/misc/keystore找到對應的認證,密鑰等檔案,代碼操作沒有許可權。


----------------------------------------以下內容被修改--------------------------------------------------

System/etc/security下面存在cacerts.bks,BouncyCastle密鑰庫,讀取時提示完整性檢查失敗,這個檔案也應該是沒有許可權訪問的

---------------------------------------------------------------------------------------------------------------

cacerts.bks是有許可權讀取的,預設密碼時changeit,如果密碼錯誤則出現完整性檢查失敗

如果需要修改cacerts.bks可以嘗試使用remount或者chmod修改讀寫權限,再訪問

certInstaller安裝的認證還未找到方法操作,看過CertInstaller的源碼,類比做了一遍依然無效

有朋友說這個只提供給wifi或者vpn使用,隱隱中感覺還是有辦法擷取,只是沒用對

(有興趣的朋友可以再試試android.security.KeyStore中的方法,類比empty返回的false,說明可以擷取正確數值

但是有些方法需要參數key,試了很多依然沒有成功)

(待續.....)

轉載請註明出處:http://blog.csdn.net/zhouyuqwert/article/details/6603004

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.