2012-10-22 42 views
7

我有一個關於C#的問題。反彙編C#

我目前正在研究醫療軟件產品,其中一個重要的事情是確保病人的數據是加密的。我對此有兩個問題:

1.)System.Security.Cryptography中AES(Rijndael)的Microsoft .NET實現有多安全?它是否有任何已知的安全漏洞,或者我很好地使用MS實現? (注意,我知道這些算法是如何工作的基本背景,但我沒有深入瞭解它是如何工作的)。

2.)由於數據與應用程序存儲在同一臺PC上,因此從C#應用程序獲取信息有多難?假設我已經某處代碼

string encrypPassword = "ThisIsMyPassword"; 
string encryptedString = EncryptString(ClearString, encrypPassword); 
// save encryptedString to harddrive 

我知道,攻擊者可能只是再往彙編代碼,並在這一點上有什麼都沒有我可以做這種情況(系統必須能夠加密/解密數據),但有沒有像C#獲取encrypPassword的快捷方式,因爲它被管理,或者像這樣的事情仍然需要你下載到彙編代碼?

+0

可能重複的[如何在.NET程序集中安全地存儲加密密鑰](http://stackoverflow.com/questions/2528405/how-to-safely-store-encryption-key-in-a-net-組裝) – Rawling

+5

點2)是你的主要問題,不用擔心1)。 –

+1

你可以看看DPAPI,看例如:http://stackoverflow.com/q/5620028/60761 –

回答

5

如果您將固定密碼編譯到您的應用程序中,那麼您無需關心AES和已知安全錯誤的安全性,因爲您的數據根本就不安全。有足夠知識的人可以訪問個人電腦,能夠解密所有的數據。

定位固定密碼通常不需要任何編程知識。大多數情況下,一個好的十六進制編輯器都可以。你甚至不需要知道使用了什麼編程語言。

如果您的數據被單個用戶使用,那麼您可以將患者數據的密碼綁定到他或她的Windows密碼(或帳戶)。 Windows爲此提供了一些特定的功能。有關如何從.NET訪問它,請參閱http://msdn.microsoft.com/en-us/library/aa302402.aspx

+0

如果您想自己嘗試,請使用ILDASM或反射器(免費)來查找您的密鑰。你會發現從二進制文件中取出它是微不足道的。 –

0

要存儲密碼數據,您可以使用System.Security命名空間的SecureString類。

+1

'SecureString'有一些優點,但它很少相關。 OP有更大的問題,'SecureString'無法解決。 – CodesInChaos

+1

@Jodrell它甚至不阻止字符串被讀取。它只能防止一些特定的威脅,如錯誤轉儲和交換文件。 – CodesInChaos

0

大多數體面的混淆器會在將代碼存儲在程序集的字符串部分之前,將代碼中的字符串加密,並在使用前注入一個方法來解密它們。這些技術早已被反彙編人員反向設計。

實際上,幾乎沒有辦法真正安全地將字符串存儲在任何編程語言中。有人幾乎總能找到字符串,或者反向工程來構建它。你可以做的最好的事情就是將攻擊者放置足夠長的時間,以使其不值得花時間和精力。在你的情況下,我可能會存儲在應用程序中加密的密碼(如在自己的應用程序外手動加密,然後複製/粘貼)。可能將其分割成不同的部分,因此不會將其存儲爲單個字符串。然後將它放回到一起並在運行時解密它,然後在運行時將其存儲在SecureString中。還要投資一個好的混淆器,因爲它將有助於掩蓋您的解密邏輯(這將成爲安全方面的薄弱環節)。

1

回答您的原始問題的第一部分 - AES的本地Windows實施經過NIST認證符合FIPS 140-2標準。在認證實施訪問被限制爲:

  1. 使用Windows加密API

  2. 使用CAPICOM COM包裝到Windows加密API

  3. 在系統使用.NET AesCryptoServiceProvider類.Security.Cryptography命名空間(此類在.NET Framework 3.5之前不可用)

據說,在RijndaelManaged類中的實現是相同的,它只是沒有通過NIST認證過程(這個過程非常漫長而且非常昂貴)。 (非軍事級別的加密 - 尤其是256位密鑰變體)。Aes算法非常安全(軍事級加密 - 尤其是256位密鑰變體)。

最大的問題(同意上面的海報)是以明文形式將加密密碼嵌入到應用程序中。