2011-05-20 100 views
6

我是一個初學java程序員。我正在研究解密一些數據的應用程序。 解密密鑰被硬編碼到軟件中,因此可以通過分析字節碼來查看。如何保護解密密鑰免遭反編譯?

我知道逆向工程不可能完全被阻止,所以我想要做的是儘可能地讓這個過程變得困難。

我的想法不是直接將密鑰放入我的代碼中,而是讓它通過某種轉換。 例如,我可以寫 -

private static final byte[] HC256A = Hex 
      .decode("8589075b0df3f6d82fc0c5425179b6a6" 
        + "3465f053f2891f808b24744e18480b72" 
        + "ec2792cdbf4dcfeb7769bf8dfa14aee4" 
        + "7b4c50e8eaf3a9c8f506016c81697e32"); 

這樣,有人在看字節碼不能讀它,立竿見影。但是必須遵循邏輯並對其應用轉換,在字節級別上這不會更容易。

那麼你們怎麼看?這有用嗎?除十六進制解碼之外,什麼可能是最好的轉換? 是否有其他方法可用來保護硬編碼的解密密鑰?

感謝您的所有建議。

+2

您可以偵聽連接的調試器(以C++工作,不知道如何在Java中執行該操作),如果是這樣,請從內存中刪除該值。 – 2011-05-20 09:30:56

+0

正在解碼的數據的靈敏度是什麼?這將有助於爲保護數據付出多少努力提供指導。隱藏字節碼中任何形式的密鑰都相對容易失敗。此外,這需要軟件的每個用戶擁有相同的密鑰,並且需要重新編譯才能更改密鑰。 – 2011-05-21 06:50:56

+0

數據非常敏感。這是一個數字媒體印刷品,如果泄漏會給公司帶來嚴重問題。 – 2011-06-17 13:44:23

回答

8

正確的方法來攻擊這種混淆(特別是在字節碼語言中)是將調試器附加到密鑰傳遞到的位置(如果無法調試,則開始分析該位置的代碼)。這樣,攻擊者根本不需要查找密鑰,他也不在乎密鑰是如何混淆的。所以你需要重新考慮你的設計。

如果你只想保護業餘愛好者,那麼拆分鍵和異或元件(可能用不同的鍵)就足夠了。還有一個竅門 - 從代碼中已經存在的文本常量(例如應用程序名稱)中派生出密鑰。這使得關鍵不如分裂或XORing更明顯。

+1

+1爲'派生關鍵' – sehe 2011-05-20 09:44:21

+0

+1爲回答**兩個**爲什麼你不應該這樣做**和**如何做到這一點;-) – 2011-05-23 06:05:22

+0

@Joachim實際上這兩個部分涵蓋了不同組的攻擊者:) – 2011-05-23 06:18:37

0

面對類似的問題(在c)我去了一次性XOR墊。這很好,因爲它看起來像垃圾......如果你真的聰明,你可以窺探使用中的(不正確)鍵。我會避免任何注入人類可讀字符串的東西,因爲這些東西總是會引起人們對代碼的注意。

+2

應用了一些位移功能的XOR焊盤可能與其獲得的效果一樣好:它並不是很好的預防措施,但它會阻止那些簡單地稱爲javah的用戶,並希望能夠直接轉儲密鑰。 – 2011-05-20 09:37:22

3

不要將密鑰編碼到源代碼中。保持分開,單獨運送,例如在Java密鑰倉庫中,並且僅限於您信任的客戶/站點/客戶端,並在許可證中放置一些法律術語,以便在泄漏密鑰存儲庫時將責任置於其上。

+0

如何將密鑰存儲在密鑰庫中? – raymi 2011-10-26 11:39:03