簡體   English   中英

使用我的應用程序的密鑰哈希來驗證來自我的應用程序的REST調用是否僅足夠安全?

[英]Is using my app's key hash to verify that REST calls are coming from my app only secure enough?

我有一個休息服務器,我只希望我的應用程序能夠與我的REST服務器通信。 例如,如果有人將URL放在瀏覽器中,他們將無法與我的服務器通信

目前,我正在考慮在請求調用中添加密鑰哈希作為額外參數,然后存儲密鑰

哈希沒有存儲在我的應用程序中,而是使用以下方法自動檢索。

public static void getHashes(Activity act) {
    PackageInfo info;
    try {
        info = act.getPackageManager().getPackageInfo("com.my.package.myapp", PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md;
            md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            String something = new String(Base64.encode(md.digest(), 0));
            //String something = new String(Base64.encodeBytes(md.digest()));
            Log.i("hash key", something);
        }
    } catch (NameNotFoundException e1) {
        Log.e("name not found", e1.toString());
    } catch (NoSuchAlgorithmException e) {
        Log.e("no such an algorithm", e.toString());
    } catch (Exception e) {
        Log.e("exception", e.toString());
    }
}

例如,在某個特定的時間,我將僅調用一次此方法,以便在編譯到生產apk后可以在logcat上看到它並將其保存到服務器中。 這意味着它將不會再次輸出給其他任何人查看。

我會將這個密鑰存儲在服務器上,並且每次提出請求時,我的應用程序都會發送該密鑰。 如果密鑰不同,則我的服務器將不會響應。

這種方法安全嗎? 誰能看到其中的缺陷?

不,這不安全。

攻擊者可以觀察到此哈希在請求中發送的單個實例,然后將其包含在自己的請求中,您的服務器將無法區分。 散列可以例如由第一人在網絡上發布以獲得。

但是,這不僅是您的方法存在的問題:還沒有針對一般問題的已知安全解決方案,請參閱此答案以進行更全面的討論(在WCF而非Android的情況下,但論點是相同的)。

不,您需要先向服務器詢問挑戰,然后返回應用程序密鑰的哈希值,該挑戰,消息本身的內容(簽名除外)以及應用程序和服務器上已知的一些隨機字節數組側。 如果采用這種方式,則應不受網絡嗅探,重播攻擊的影響,還應嘗試將合法應用用作消息模板生成器(有效身份驗證,其他內容可能會被替換)。 您也可以以相同的方式驗證服務器端。

不幸的是,在.apk文件由攻擊者掌握之后,幾乎無法對應用程序進行逆向工程。 但是,Google和Amazon應用程序商店提供了一些保護,以防止拆卸.apk。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM