我有一個處理加密數據的應用程序,我儘可能小心地使密鑰不可訪問,但當然應用程序需要以某種方式知道它們。在VB.NET中保護內存(存儲密鑰)
我已經將鍵值硬編碼爲函數返回值,所以它們不應該在內存中過長時間,但是我猜它仍然可以被讀取。有沒有辦法讓內存區域無法訪問?如果這是一個衆所周知的問題(我懷疑它是這樣),我不是一個計算機科學家,所以很抱歉。
從反編譯保護他們的是另一天的問題...
提前感謝!
我有一個處理加密數據的應用程序,我儘可能小心地使密鑰不可訪問,但當然應用程序需要以某種方式知道它們。在VB.NET中保護內存(存儲密鑰)
我已經將鍵值硬編碼爲函數返回值,所以它們不應該在內存中過長時間,但是我猜它仍然可以被讀取。有沒有辦法讓內存區域無法訪問?如果這是一個衆所周知的問題(我懷疑它是這樣),我不是一個計算機科學家,所以很抱歉。
從反編譯保護他們的是另一天的問題...
提前感謝!
要做到這一點的方法是使用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();
你可以不會對SecureString進行硬編碼,而是用於字符串(如果有的話)。 DPAPI更適用於密鑰(二進制數據),但仍然不能(有意義)硬編碼。內存保護方案非常薄弱,安全方面。 – bartonjs
的例子編輯:添加HSM不一定是解決方案的情況下
A你提到的,反編譯器可以獲取你的密鑰;這是你應該的原因的一部分從不有一個硬編碼的解密密鑰(一個硬編碼的公鑰加密是不太壞)。
如果我誤解了這個問題,並且您的密鑰沒有進行硬編碼,但您在不需要時隱藏了密鑰,那麼可以使用像ProtectedData.Protect這樣的API。
但是,根據你在做什麼,這可能不是正確的答案(誰是你的攻擊者?你在防守什麼?)。
從防禦:
你會注意到的東西,你可以用實際的內存保護抵禦列表很小。更好的做法是讓它無法讀取密鑰,將其移至HSM。 Windows CNG支持通過HSM進行對稱加密,.NET 4.6.2(當前處於預覽狀態)支持在the AesCng(string, CngProvider) constructor中使用此行爲。
「永遠不要有一個硬編碼的解密密鑰」後來以「誰是你的攻擊者」爲依據。 「從不」有點苛刻,信息可能微不足道(啤酒狂歡在哪裏),攻擊者可能平均是好奇的青少年。反彙編文件並不是微不足道的,她是一名專業的安全人員。在某些情況下,即使不可能直接進行加密和解密,只能使用設備密碼和根設備進行活動調試。最後,沒有任何方案是100%安全的。 – zaph
至於HSM,這是一個很好的解決方案,但有一些注意事項:一個人必須有權訪問服務器才能安裝一個,典型的HSM起價大概在10K美元左右,一般情況下,密鑰在使用時仍然在RAM中。 – zaph
@zaph真的,「從來沒有」可能不適用,但有一個問題,「如果你不在乎有人打破這個關鍵,爲什麼它被加密?」。至於HSM,關鍵在於必須確定適當的威脅模型,並且HSM解決了許多(但不是全部)威脅(並不總是最簡單/最便宜的)。但是一個適當的HSM可以進行片上加密/解密,所以密鑰不應該放在主計算機的RAM中(這就是爲什麼它是有效的)。 – bartonjs
嘿隊友,歡迎來到堆棧溢出,這裏是一個線程,我發現你可能會覺得有用,http://stackoverflow.com/questions/23513831/hash-with-md5-in-vb-net – Werdna