2009-07-10 28 views
4

我的應用程序需要使用幾個硬編碼對稱密鑰(雖然我知道存儲公鑰是唯一完美的解決方案,這是不可協商的)。我們希望將密鑰存儲爲模糊,以便通過分析可執行文件來識別它們,並在儘可能少的時間內在內存中「活」 - 以增加內存轉儲檢索它們的難度明文。我有興趣使用C++功能(使用某種scoped_key想到)。該解決方案必須是portable - Windows,Linux,MacOS - ,因此它不能利用操作系統加密API。在C++中隱藏密鑰的跨平臺方式?

你會如何去設計這樣一個系統?非常感謝。

+0

這是不可能的。你想在這裏解決什麼問題?也許還有另一種方法來實現它。 – 2009-07-11 02:25:20

+0

如果你可以解釋爲什麼非對稱加密不是一個選項 – ykaganovich 2009-07-11 03:16:10

+0

也許這會有所幫助,如果你解釋了你想達到的目的,而不僅僅是討論你想如何實現它。既然你聲稱存儲公鑰是一個完美的解決方案,這意味着你要麼編寫只能加密(但不能解密)的軟件,要麼編寫需要驗證的軟件。沒有更多的細節,很難做出任何有用的評論。 – Accipitridae 2009-07-11 16:04:19

回答

3

您的scoped_key可以簡單地爲堆棧上的KeyHolder對象。它的構造函數接受混淆的緩衝區,並從中創建一個真正的密鑰,並且其析構函數將內存清零並釋放內存。

至於如何實際混淆二進制中的密鑰,你可能嘗試的一個愚蠢的選擇是放在一個更大的隨機二進制塊中,記住它的偏移量和大小,並可能與一些短的隨機序列異或。

如果你做XORing事情,你實際上可以避免在內存中擁有真正的密鑰。只需修改解密以從密鑰中讀取一個字節,然後再使用它,並將其與適當的值異或。

*這裏添加免責聲明如何愚蠢安全通過隱藏是*

0

如果不利用任何平臺上你會遇到,你不能保證你可以有效地隱藏在你的程序中的對稱密鑰。您可以假設攻擊者將擁有一個調試器,並最終找出如何在必須使用該密鑰解密的函數中設置斷點。然後它就結束了。

-2

爲什麼不看隱寫,因爲你可以隱藏圖像中的密鑰。有可能找到關鍵字,但如果圖像沒有遵循明顯的模式(例如空間圖像),那麼它可能會更難。這可以是跨平臺的。

3

你有沒有考慮過,如果這實際上是你的程序的弱點?讓我們假設你是在進行許可證檢查 - 儘管其他檢查同樣適用。不管如何藏好你的密鑰,以及效果如何混淆你的算法,在某些時候你必須做這樣的事情:

if(!passesCheck()) { 
    exit(1); 
} 

你的潛在對手沒有找到鑰匙,解密,弄清楚算法或其他任何東西。他們所要做的就是在代碼中找到確定檢查是否成功的位置,並用'jmp'替換'jnz'指令以使測試無條件地通過。