有時(shí)我們需要確保一個(gè)應(yīng)用就是我們想要啟動(dòng)的那個(gè)應(yīng)用,從而確保應(yīng)用間通信的安全。這話聽起來有點(diǎn)繞,下面以一個(gè)具體的例子來說明。
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、三亞ssl等。為1000多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的三亞網(wǎng)站制作公司假如一家公司A做了一個(gè)支付應(yīng)用PayApp,包名是”com.testa.pay”。隨著這個(gè)支付應(yīng)用市場(chǎng)越做越大,他們希望將其接口開放給其他公司,以使自己的公司獲得更多的現(xiàn)金流。
首先,想要集成PayApp的公司B需要向公司A進(jìn)行注冊(cè),注冊(cè)成功后A公司分配給公司B三個(gè)東西,一個(gè)獨(dú)一無二的ID,一個(gè)public key,一個(gè)private key。這三個(gè)信息都是敏感的,不能泄露給公司A和公司B之外的其他公司。
當(dāng)?shù)谌綉?yīng)用想要調(diào)用PayApp時(shí),需要傳入上面分配的三個(gè)參數(shù)傳遞給PayApp,PayApp在跟A公司的支付網(wǎng)關(guān)進(jìn)行交互,然后將支付結(jié)果遞交給調(diào)用者。
假如此時(shí),有一個(gè)***開發(fā)了一個(gè)惡意應(yīng)用,并且將包名取得跟PayApp一樣。然后他將PayApp從手機(jī)上刪除,裝上自己的應(yīng)用,那么當(dāng)公司B的應(yīng)用再次調(diào)用支付接口時(shí),就把所有的信息傳遞給了***自己的應(yīng)用!
公司A為了防止這種情況發(fā)生,專門開發(fā)了一個(gè)支付sdk,名字叫“PaySdk”,該sdk在調(diào)用PayApp前會(huì)對(duì)PayApp的簽名進(jìn)行校驗(yàn),當(dāng)校驗(yàn)通過時(shí),才會(huì)將數(shù)據(jù)傳遞給PayApp。然后,所有想要調(diào)用PayApp接口的第三方應(yīng)用,都需要繼承支付sdk。這樣就能防止信息被竊取。
下面詳細(xì)介紹簽名驗(yàn)證的具體過程:
首先,我們需要對(duì)android應(yīng)用簽名有一個(gè)基本了解:
1. 任何安裝到android設(shè)備上的應(yīng)用都已經(jīng)被簽名,即使debug狀態(tài)的app也已經(jīng)用debug的keystore簽過名。
2. 需要發(fā)布的應(yīng)用一定要用release的keystore進(jìn)行簽名。
3. 一個(gè)公司的release keystore只應(yīng)該自己使用,不能泄露給其他人活公司。
4. 一個(gè)應(yīng)用可能有多個(gè)簽名。
關(guān)于如何生成keystore,并且給一個(gè)應(yīng)用簽名,可以查看官網(wǎng)教程:http://developer.android.com/intl/zh-cn/tools/publishing/app-signing.html
我們是通過對(duì)比簽名的hash值來確保其完整性的,所以在此之前,我們應(yīng)該獲取release keystore對(duì)應(yīng)的簽名的hash值,這樣在程序運(yùn)行時(shí)才能進(jìn)行比對(duì)。關(guān)于簽名的hash值,我們可以通過下面的代碼來獲?。?/p>
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”應(yīng)該被替換為你想要獲取的應(yīng)用的包名。代碼運(yùn)行后,log輸出如下:
04-28 13:30:34.259 1123-1123/com.zlsam.signchecher I/MainActivity: hash: 6qX30I5Kpx4agIeolKla75oO+zA= |
這里我們的PaySdk需要將“hash:”后面的那個(gè)字符串記錄下來,本例中是“6qX30I5Kpx4agIeolKla75oO+zA=”。一個(gè)應(yīng)用可能有多個(gè)簽名,因此,我們需要記錄和比對(duì)所有的簽名。
然后,當(dāng)?shù)谌綉?yīng)用通過PaySdk調(diào)用支付時(shí),PaySdk首先通過上面代碼獲取應(yīng)用包”com.testa.pay”的所有簽名hash,然后檢查這些動(dòng)態(tài)獲取的hash值是否都在之前記錄下來的hash當(dāng)中。如果是,那么驗(yàn)證通過,否則驗(yàn)證失敗。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。