簡體   English   中英

在C ++中隱藏加密密鑰的跨平台方式?

[英]Cross-platform way of hiding cryptographic keys in C++?

我的應用程序需要使用幾個硬編碼的對稱加密密鑰 (雖然我知道存儲公鑰是唯一完美的解決方案,這是不可協商的)。 我們希望將密鑰存儲為模糊處理 ,以便通過分析可執行文件來識別它們,並在盡可能短的時間內在內存中“活動” - 以增加內存轉儲在清除時檢索它們的難度。文本。 我對使用C ++功能感興趣( scoped_key使用某種scoped_key )。 該解決方案必須是可移植的 - Windows,Linux,MacOS - 因此它無法利用操作系統加密API。

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

你所要求的就是通過默默無聞的安全。 如果你讓我們中的一個想出一個想法,你甚至都沒有。

John Skeet也有一篇很好的文章。

我可以說,做一些隨意的事情。

你的scoped_key可以只是堆棧上的KeyHolder對象。 它的構造函數接受混淆的緩沖區並從中生成一個真正的密鑰,它的析構函數將內存清零並釋放內存。

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

如果您執行XORing操作,您實際上可以避免在內存中使用真正的密鑰。 只需修改解密以從密鑰中讀取一個字節,然后在使用它之前,使用適當的值對其進行異或。

*在這里加上關於通過默默無聞是多么愚蠢的安全性的免責聲明*

您是否考慮過這實際上是您計划中的弱點? 讓我們假設您正在進行許可證檢查 - 盡管其他檢查同樣適用。 無論你的密鑰隱藏得多好,以及你的算法如何混淆,在某些時候你必須做這樣的事情:

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

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

您應該查看Tamper Resistance軟件,例如CloakwareArxan

TR不便宜:)

如果您沒有利用您將運行的任何平台,則無法保證您可以在程序中有效地隱藏對稱加密密鑰。 您可以假設攻擊者將擁有一個調試器,並最終將弄清楚如何在必須使用密鑰解密的函數中設置斷點。 然后是游戲結束。

為什么不看隱寫術,因為你可以隱藏圖像中的鍵。 可以找到密鑰,但如果圖像不遵循明顯的圖案(例如空間圖像),則可能更難。 這可以是跨平台的。

暫無
暫無

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

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