2016-07-26 96 views
1

我有一個處理加密數據的應用程序,我儘可能小心地使密鑰不可訪問,但當然應用程序需要以某種方式知道它們。在VB.NET中保護內存(存儲密鑰)

我已經將鍵值硬編碼爲函數返回值,所以它們不應該在內存中過長時間,但是我猜它仍然可以被讀取。有沒有辦法讓內存區域無法訪問?如果這是一個衆所周知的問題(我懷疑它是這樣),我不是一個計算機科學家,所以很抱歉。

從反編譯保護他們的是另一天的問題...

提前感謝!

+0

嘿隊友,歡迎來到堆棧溢出,這裏是一個線程,我發現你可能會覺得有用,http://stackoverflow.com/questions/23513831/hash-with-md5-in-vb-net – Werdna

回答

1

要做到這一點的方法是使用SecureString。使用比正常字符串稍微笨拙一點,但它確實是您在這種情況下需要的東西。

這裏是文檔吧:https://msdn.microsoft.com/en-us/library/system.security.securestring(v=vs.110).aspx

和一些更多的信息在這裏看:Is SecureString ever practical in a C# application?

這裏是設置此使用「字符串值」

 var s = new System.Security.SecureString();   
     s.AppendChar('s'); 
     s.AppendChar('e'); 
     s.AppendChar('c'); 
     s.AppendChar('r'); 
     s.AppendChar('e'); 
     s.AppendChar('t'); 
     s.AppendChar('s'); 
     s.AppendChar('q'); 
     s.AppendChar('u'); 
     s.AppendChar('i'); 
     s.AppendChar('r'); 
     s.AppendChar('r'); 
     s.AppendChar('e'); 
     s.AppendChar('l'); 
     s.MakeReadOnly(); 
+1

你可以不會對SecureString進行硬編碼,而是用於字符串(如果有的話)。 DPAPI更適用於密鑰(二進制數據),但仍然不能(有意義)硬編碼。內存保護方案非常薄弱,安全方面。 – bartonjs

0

的例子編輯:添加HSM不一定是解決方案的情況下

A你提到的,反編譯器可以獲取你的密鑰;這是你應該的原因的一部分從不有一個硬編碼的解密密鑰(一個硬編碼的公鑰加密是不太壞)。

如果我誤解了這個問題,並且您的密鑰沒有進行硬編碼,但您在不需要時隱藏了密鑰,那麼可以使用像ProtectedData.Protect這樣的API。

但是,根據你在做什麼,這可能不是正確的答案(誰是你的攻擊者?你在防守什麼?)。

從防禦:

  • 沃森轉儲被髮送到微軟包含密鑰
    • ProtectedData.Protect(或HSM)
  • 的任意內存讀取的安全漏洞在您的代碼被遠程攻擊者利用
    • Protect edData。保護(或諷刺「不寫那種脆弱的」,或HSM)
  • 管理員(合法或以其他方式)能夠附加一個調試器和讀取密鑰
    • 移動的關鍵到硬件安全模塊(HSM)
  • 你的過程中被調出和管理員能夠從頁面文件讀取它
    • HSM
  • 的任意執行代碼中的被遠程攻擊者
    • HSM
  • 您的系統休眠和休眠的有效載荷被利用的人誰偷了你的硬盤驅動器中讀取的安全漏洞
    • BitLocker或HSM
  • 過程碰撞du MP這仍然是在硬盤上,驅動被盜
    • 的BitLocker或HSM
  • 整個計算機被物理被盜
    • BitLocker的(但不一定是HSM,因爲這將有也被偷了)。

你會注意到的東西,你可以用實際的內存保護抵禦列表很小。更好的做法是讓它無法讀取密鑰,將其移至HSM。 Windows CNG支持通過HSM進行對稱加密,.NET 4.6.2(當前處於預覽狀態)支持在the AesCng(string, CngProvider) constructor中使用此行爲。

+0

「永遠不要有一個硬編碼的解密密鑰」後來以「誰是你的攻擊者」爲依據。 「從不」有點苛刻,信息可能微不足道(啤酒狂歡在哪裏),攻擊者可能平均是好奇的青少年。反彙編文件並不是微不足道的,她是一名專業的安全人員。在某些情況下,即使不可能直接進行加密和解密,只能使用設備密碼和根設備進行活動調試。最後,沒有任何方案是100%安全的。 – zaph

+0

至於HSM,這是一個很好的解決方案,但有一些注意事項:一個人必須有權訪問服務器才能安裝一個,典型的HSM起價大概在10K美元左右,一般情況下,密鑰在使用時仍然在RAM中。 – zaph

+0

@zaph真的,「從來沒有」可能不適用,但有一個問題,「如果你不在乎有人打破這個關鍵,爲什麼它被加密?」。至於HSM,關鍵在於必須確定適當的威脅模型,並且HSM解決了許多(但不是全部)威脅(並不總是最簡單/最便宜的)。但是一個適當的HSM可以進行片上加密/解密,所以密鑰不應該放在主計算機的RAM中(這就是爲什麼它是有效的)。 – bartonjs