簡體   English   中英

如何在.NET程序集中安全地存儲加密密鑰

[英]How to safely store encryption key in a .NET assembly

為了防止有人輕易抓取我的數據,我將來自我服務的數據緩存為加密文件(基本上是復制保護)。

但是,為了做到這一點,我必須將加密密鑰存儲在.NET程序集中,以便能夠加密和解密這些文件。

意識到像Red Gate的.NET Reflector這樣的工具可以直接拉出我的鑰匙,我覺得這不是一種非常安全的方式......這樣做有什么最好的做法嗎?

您必須確定什么是可接受的風險級別。 這樣做沒有“安全”的方法。

如果有人使用反射器,或者只是使用System.Reflection.Assembly類打開程序集並以這種方式獲取資源的風險太大,那么下一步可能就是在啟動時從服務器下載密鑰。

然后,有人必須在使用代碼時執行類似調試的操作,並以此方式獲取密鑰。 您可以使緩存的內容過期並交換密鑰。 您可以使每個人都有自己的密鑰來保護一個用戶的數據與另一個用戶。

你可以做很多事情,但如果你的目標是讓某人無法解密你正在他們的機器上裝配的裝配具有解密能力的信息,你應該知道這幾乎是不可能的。 您所能做的就是提高盜版密鑰/數據的成本 ; 你不能阻止它。

您無法阻止解密,但您可以阻止偽造數據的重新加密:

只要您的代碼在其他人可以訪問的計算機上運行,​​就無法阻止他們檢查程序。 然而,反編譯和分析會花費時間。 正如MaxGuernseyIII指出的那樣,這完全取決於可接受的威脅等級。

在您的情況下,問題不在於黑客可以反編譯您的代碼,而是更多的是他們可以更改您想要保護的數據(誰擁有許可證)。

因此,您可以使用公鑰加密方法來加密數據。 黑客可以通過這種方式閱讀,但他無法重新加密。

正如Max暗示的那樣,您需要考慮威脅模型。

你擔心什么樣的攻擊者? (關心某些人是合理的,而不關心他人是合法的)。 典型的類別可能是“購買程序的非精通計算機的用戶”,“願意花費數小時解決方案的專職人員”,“知道如何在線發現裂縫的臨時用戶”等。

根據您的具體情況,解決方案可能會有所不同。

一個有趣/令人遺憾的項目是,如果你的產品很受歡迎,那么只需要一兩個專門的人坐下來打破它然后釋放所有的補丁。 我認為這是軟件的本質,當整個應用程序在他們的機器上運行時,這是一個未解決的問題。

顯然,這意味着如果您的應用程序作為一個網站運行,它就不是問題 - 即它位於您控制的機器上。

我知道這不是一個特別有用的答案。

暫無
暫無

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

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