Androd開發(fā):保存私密字符串到So庫

logo

未經(jīng)允許禁止轉載

一听想、寫這篇文章的原因

在平日開發(fā)中蛮艰,我們時常是需要保存一些字符串,而這些字符串比較重要窍侧,我們可以通過一些途徑進行保存</br>

(1)通過網(wǎng)絡分發(fā)動態(tài)的密碼,以及對應的加密的字符串转绷,在一定時間內密碼有效伟件。
(2)密碼本地存儲在一些地方,如SP议经,數(shù)據(jù)庫斧账,MMKV,動態(tài)鏈接庫等等

本文就基于第二種方案中的動態(tài)鏈接庫去進行開發(fā)煞肾,即我們俗稱的So庫咧织,由于不存在百分百解不開的加密方式,都是時間長和短的問題籍救,我們要增加的是解密的時間成本习绢,而且考慮到開發(fā)時候的方便以及性能問題,我們都采用多種結合蝙昙,例如 網(wǎng)路+本地秘鑰雙重校驗闪萄,或者動態(tài)分發(fā)加密關鍵信息再組合等等。

二耸黑、Gradle Plugin開發(fā)

1桃煎、建一個Module

創(chuàng)建模塊

2、Grdlde基本配置

假設我們的Module名字是plugin,那么在Project根目錄的中,修改引入方法

//include(":plguin") 改成下面
includeBuild("plguin")

本項目基于kotlin開發(fā)的所以需要把build.gradle修改為build.gradle.kts文件</br>
大致的配置如下:

buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.21")
    }
}

dependencies {
    compileOnly(gradleApi())
    compileOnly("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.21")
    compileOnly("com.android.tools.build:gradle:4.0.1")
    implementation("com.squareup:javapoet:1.13.0") //用于生產(chǎn)JAVA代碼
}

gradlePlugin {
    plugins {
        create(Plugin的名字大刊,自己定義) {
            id = "自己定義獨立Id"
            implementationClass = "對應的Plugin的路徑为迈,即包名.類名"
        }
    }
}

其中“org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.21” 可以修改為 “kotlin-dsl”
主要是為了導入Kotlin開發(fā)Gradle Plugin的基礎環(huán)境, "com.squareup:javapoet:1.13.0" 用于生產(chǎn)自定義的JAVA代碼,動態(tài)生成代碼處理我們儲存的內容缺菌。

如何實現(xiàn)實現(xiàn)獨立存在:app和:Library

1葫辐、自己生成CMakeLists文件

如果有NDK開發(fā)經(jīng)驗都應該知道,我們需要一個CMakeLists.txt文件去構建混合了Native C++的項目伴郁,而這個CMakeLists.txt很容易存在沖突等問題耿战,包括同名的動態(tài)鏈接庫也是,所以我們利用Gradle的Task任務進行焊傅,動態(tài)生成CMakeLists.txt,并且So庫的名字也是不同名字剂陡,內容大致如下:

cmake_minimum_required(VERSION 3.4.1)

add_library(
        core-client //你的.So庫名字狈涮,就是,生成結果是libcore-client.so文件鸭栖,System.loadLibrary("core-client")
        
        SHARED

        src/main/cpp/core-client.cpp
        src/main/cpp/core-environment.cpp
        src/main/cpp/core-encryption.cpp
)

find_library(
              log-lib
              log )

target_link_libraries(
        core-client  //你的.So庫名字
                     ${log-lib} )

有了這個關鍵因素那么我們就可以解決重復名字的.So庫的問題了歌馍,自己改了這個名字,讓互不干擾晕鹊。

2松却、如何把Nativce方法動態(tài)綁定到我們的JAVA文件

既然我們的.So是獨立的那么,我們調用這些方法的JAVA文件最好也是獨立一個溅话,這時候又要兼容app和libray的存在晓锻,就會出現(xiàn)包名路徑不同,如果單純的傳統(tǒng)的native方法自動生成代碼的不可行了

extern "C"
包_名_XXX_XXX_XX_名字(JNIEnv *env,jclass clazz)

這種不能滿足我們的要求飞几,我們需要動態(tài)注冊方法

jint JNI_OnLoad(JavaVM *vm, void *reserved)// System.loadLibrary("") 加載

那我就在這里注冊方法

extern "C" 
JNIEXPORT jstring JNICALL getString(JNIEnv *env,jclass clazz,jstring key_){
    return env->NewStringUTF(result);
}

JNINativeMethod methods[] = {
        { "getString", "(Ljava/lang/String;)Ljava/lang/String;",(void*)getString},
};

jint JNI_OnLoad(JavaVM *vm, void *reserved) {
    env->RegisterNatives(clazz, methods, sizeof(methods)/sizeof(JNINativeMethod));
    return JNI_VERSION_1_6;
    }
//對應JAVA的方法
public static native String getString(String key);

這個JNINativeMethod methods[]其實很好理解砚哆,第一個是方法名字,第二個是(參數(shù))和返回值(return = what?),第三個指向的實現(xiàn)方法
具體怎么填寫循狰,這里也不展開細講窟社。找到這篇參考文章

3、支持兩種加密方式

本項目采用最簡單的兩種對稱加密方式:AES和DES

具體調用

由于庫我已經(jīng)上傳到Jitpack了,所以需要在根目錄的project中配置環(huán)境

buildscript {

repositories {
        google()
        jcenter()
        maven { setUrl("https://jitpack.io") }
    }

dependencies {
        classpath("com.occ.orca:orca.so:2.0.0-release13")
    }
}

然后在項目的module和app中build.gradle添加

plugins {
    id 'com.android.application'
    id 'Orca' //必須先于kotlin-android 后于com.android.application
    id 'kotlin-android'
}

使用也很方便绪钥,在項目或者模塊的build.gradle的里書寫

android{
   Orca.go{
        isDebug = true //默認值為false灿里,必須輸入Signature 
        encryptMode = "des" // 輸入AES或者DES,不用區(qū)分大小寫
        storeSet{
            "data"{
                value = "4444444444"
            }
            "1223"{
                value = "888888" //命名數(shù)字開頭程腹,方法名會有下劃線
            }
        }
    }
  }
  
  //這是我們調用的地方匣吊,注意CoreClient有包名的區(qū)分,不是把所有結果集合到同一個類里
  val data = CoreClient.getData()
  val data1 = CoreClient.get_1223()
  

4寸潦、使用注意

代碼在C++層中色鸳,進行了判斷簽名的校驗,如果簽名校驗錯誤會直接崩潰见转,字段為secretKey命雀,而你們加密的所用到的Key則為字段signature,而控制是否輸入signatureisDebug字段進行控制,都是小駝峰寫法斩箫。

小結

本項目采用的AESEncryption和DESEncryption吏砂,提出的方案還有很多需要完善的處理,后續(xù)會考慮直接在C++層做加密的運算乘客,歡迎各位Pull Request.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末狐血,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子易核,更是在濱河造成了極大的恐慌匈织,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缀匕,居然都是意外死亡纳决,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門弦追,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岳链,“玉大人,你說我怎么就攤上這事劲件。” “怎么了约急?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵零远,是天一觀的道長。 經(jīng)常有香客問我厌蔽,道長牵辣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任奴饮,我火速辦了婚禮纬向,結果婚禮上,老公的妹妹穿的比我還像新娘戴卜。我一直安慰自己逾条,他們只是感情好,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布投剥。 她就那樣靜靜地躺著师脂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪江锨。 梳的紋絲不亂的頭發(fā)上吃警,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音啄育,去河邊找鬼酌心。 笑死,一個胖子當著我的面吹牛挑豌,可吹牛的內容都是我干的安券。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼浮毯,長吁一口氣:“原來是場噩夢啊……” “哼完疫!你這毒婦竟也來了?” 一聲冷哼從身側響起债蓝,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤壳鹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后饰迹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芳誓,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡余舶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了锹淌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匿值。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赂摆,靈堂內的尸體忽然破棺而出挟憔,到底是詐尸還是另有隱情,我是刑警寧澤烟号,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布绊谭,位于F島的核電站,受9級特大地震影響汪拥,放射性物質發(fā)生泄漏达传。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一迫筑、第九天 我趴在偏房一處隱蔽的房頂上張望宪赶。 院中可真熱鬧,春花似錦脯燃、人聲如沸搂妻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叽讳。三九已至,卻和暖如春坟募,著一層夾襖步出監(jiān)牢的瞬間岛蚤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工懈糯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涤妒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓赚哗,卻偏偏與公主長得像她紫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屿储,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內容