中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android安全之應用簽名驗證

發布時間:2020-06-21 14:02:31 來源:網絡 閱讀:3402 作者:longsam 欄目:移動開發

Android安全之應用簽名驗證

有時我們需要確保一個應用就是我們想要啟動的那個應用,從而確保應用間通信的安全。這話聽起來有點繞,下面以一個具體的例子來說明。


假如一家公司A做了一個支付應用PayApp,包名是”com.testa.pay”。隨著這個支付應用市場越做越大,他們希望將其接口開放給其他公司,以使自己的公司獲得更多的現金流。


首先,想要集成PayApp的公司B需要向公司A進行注冊,注冊成功后A公司分配給公司B三個東西,一個獨一無二的ID,一個public key,一個private key。這三個信息都是敏感的,不能泄露給公司A和公司B之外的其他公司。


當第三方應用想要調用PayApp時,需要傳入上面分配的三個參數傳遞給PayApp,PayApp在跟A公司的支付網關進行交互,然后將支付結果遞交給調用者。


假如此時,有一個***開發了一個惡意應用,并且將包名取得跟PayApp一樣。然后他將PayApp從手機上刪除,裝上自己的應用,那么當公司B的應用再次調用支付接口時,就把所有的信息傳遞給了***自己的應用!


公司A為了防止這種情況發生,專門開發了一個支付sdk,名字叫“PaySdk”,該sdk在調用PayApp前會對PayApp的簽名進行校驗,當校驗通過時,才會將數據傳遞給PayApp。然后,所有想要調用PayApp接口的第三方應用,都需要繼承支付sdk。這樣就能防止信息被竊取。


下面詳細介紹簽名驗證的具體過程:


首先,我們需要對android應用簽名有一個基本了解:

1. 任何安裝到android設備上的應用都已經被簽名,即使debug狀態的app也已經用debug的keystore簽過名。

2. 需要發布的應用一定要用release的keystore進行簽名。

3. 一個公司的release keystore只應該自己使用,不能泄露給其他人活公司。

4. 一個應用可能有多個簽名。


關于如何生成keystore,并且給一個應用簽名,可以查看官網教程:http://developer.android.com/intl/zh-cn/tools/publishing/app-signing.html


我們是通過對比簽名的hash值來確保其完整性的,所以在此之前,我們應該獲取release keystore對應的簽名的hash值,這樣在程序運行時才能進行比對。關于簽名的hash值,我們可以通過下面的代碼來獲取:



PackageInfo pkgInfo;

try {

    pkgInfo = mActivityContext.getPackageManager().getPackageInfo(targetPkg, PackageManager.GET_SIGNATURES);

} catch (PackageManager.NameNotFoundException e) {

    Toast.makeText(mActivityContext, "The target package is not found!", Toast.LENGTH_SHORT).show();

    e.printStackTrace();

    return;

}

for (Signature signature : pkgInfo.signatures) {

    try {

        Log.i(TAG, “hash: " + Base64.encodeToString(MessageDigest.getInstance("SHA").digest(signature.toByteArray()), Base64.NO_WRAP));

    } catch (NoSuchAlgorithmException e) {

        e.printStackTrace();

    }

}



上面代碼中,”targetPkg”應該被替換為你想要獲取的應用的包名。代碼運行后,log輸出如下:


04-28 13:30:34.259 1123-1123/com.zlsam.signchecher I/MainActivity: hash: 6qX30I5Kpx4agIeolKla75oO+zA=


這里我們的PaySdk需要將“hash:”后面的那個字符串記錄下來,本例中是“6qX30I5Kpx4agIeolKla75oO+zA=”。一個應用可能有多個簽名,因此,我們需要記錄和比對所有的簽名。


然后,當第三方應用通過PaySdk調用支付時,PaySdk首先通過上面代碼獲取應用包”com.testa.pay”的所有簽名hash,然后檢查這些動態獲取的hash值是否都在之前記錄下來的hash當中。如果是,那么驗證通過,否則驗證失敗。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长汀县| 新化县| 靖江市| 岱山县| 宾川县| 乌鲁木齐县| 张家港市| 潮安县| 彭泽县| 磐石市| 织金县| 开阳县| 黄浦区| 眉山市| 朔州市| 丹寨县| 鄂伦春自治旗| 宁国市| 汪清县| 温泉县| 津市市| 扎兰屯市| 临汾市| 枞阳县| 仙桃市| 思南县| 垫江县| 宣威市| 蓝田县| 西乌珠穆沁旗| 天柱县| 巫溪县| 揭东县| 文昌市| 八宿县| 湘乡市| 内黄县| 汉源县| 象州县| 定远县| 安丘市|