我有一個在我的Android應用程序之一的mcrypt加密和解密例程。這本質上是解密一個通過獲取的字符串。遠程通話。當然,「祕密密鑰」存儲在代碼中,但任何使用apktool的人都可以明顯地看到代碼並查看我的密鑰。保持祕密密鑰祕密 - 在Android應用程序..任何想法
無論如何加密所有的Java代碼,以便即使反編譯它將不可讀/可理解嗎?
我聽說過ProGuard,但從閱讀它看來,似乎不足以達到此目的。
我有一個在我的Android應用程序之一的mcrypt加密和解密例程。這本質上是解密一個通過獲取的字符串。遠程通話。當然,「祕密密鑰」存儲在代碼中,但任何使用apktool的人都可以明顯地看到代碼並查看我的密鑰。保持祕密密鑰祕密 - 在Android應用程序..任何想法
無論如何加密所有的Java代碼,以便即使反編譯它將不可讀/可理解嗎?
我聽說過ProGuard,但從閱讀它看來,似乎不足以達到此目的。
您不應該在代碼中放置密鑰。編譯後的代碼可以很容易地進行反向設計,任何具有調試器的人都可以掛鉤到創建實際密鑰的位置。安全性總是依賴於算法,假設客戶端代碼是公開的,並且潛在的攻擊者擁有副本。
在代碼中隱藏文字只是延遲了攻擊者獲取密鑰的過程,但並未以任何方式阻止它。
那麼,你有什麼建議? – SpacialWise
可能有一個配置屏幕,以便用戶能夠定義它自己的psw。然後你存儲usr pasw的散列,當應用啓動時,請求psw。如果psw散列與存儲的散列相匹配,則授予用戶訪問權限。您還可以向用戶發放密鑰,在數據庫中存儲哈希值,並讓他們在線首次使用時驗證其應用程序。 –
我不是安全專家,但我確實知道VM編譯語言可以很容易地反編譯,您可以嘗試使用ProGuard混淆您的代碼,但仍然可讀,我會建議它嘗試保存它並隱藏您的鍵使用Java Crypto,這類問題之前已經被問過類似Android Crypting Database或Encrypt Information in Android,我不期望回答你的問題,但給你一個指導路線,從現在開始。
謝謝Necronet。我在這裏閱讀了幾篇文章,沒有一個明確的解決方案..我會檢查你鏈接的。 – SpacialWise
可以代替生成你需要獲取字符串的新鑰匙,每次
,那麼你就需要做一個硬編碼證書的密鑰交換(這是安全的,如果正確實施)
或只是如果僅在傳輸過程中使用SSL,請使用SSL
這種方法聽起來似乎合理..每次生成一個新密鑰都是可行的,但我不熟悉硬編碼證書的密鑰交換。你能否進一步闡述或者指出我的方向?我' – SpacialWise
客戶端計算機上的所有代碼均可讀取。你所能做的最好的是讓它更難找到鑰匙。
建議:代碼中會有一些文本字符串,例如「請稍等,而您的請求正在處理......」找到這樣一條消息,並生成一個字節數組,通過XORing將該消息轉換爲真正的密鑰帶有文本字符串的字節數組。
例如「松鼠」異或[16 1D 10 19 1A 13 0B 18] =>「大象」
只有「松鼠」和字節數組實際出現在你的代碼中。
嗨!是的,這符合我原先的想法。基本上有幾個例程(利用算法)可以創建string.xml中的數據以及其他一些隨機嵌入的變量。將所有這些組合成嵌入到不同類中的幾種方法。然後最後使用ProGuard來追蹤哪些特定功能/例程更具挑戰性。 – SpacialWise
我知道即使在這種情況下,仍然有人可以找出它,但它更費時 - 從簡單的反編譯和閱讀必須追蹤代碼幾分鐘。 – SpacialWise
問題是爲什麼字符串被加密?如果是用於傳輸和服務器存儲安全,那麼使用公鑰加密。如果你想從用戶那裏「隱藏」它,那麼你運氣不好,因爲你的應用程序可以「看到」所有的用戶。 –
該字符串被加密以隱藏流式傳輸文件的位置 - 意圖是混淆,並且至少使臨時用戶/腳本kiddies更難以獨立於應用下載mp3。我知道你說的話,並且完全理解應用程序可以看到的任何東西 - 任何人都可以調試,解密或反編譯 - 我只是想讓它變得更加困難。有人確定將仍然經歷所有這些並取得成功。沒有biggie ..只是保持腳本kiddies基本上.. – SpacialWise
爲什麼不讓客戶端生成密鑰對並將其公鑰發送到服務器與請求? –