拆卸C#

时间:2012-10-22 10:54:46

标签: c# security

我有一个关于C#的问题。

我目前正在开发一种医疗软件产品,其中一项重要的事情是确保患者的数据是加密的。我有两个问题:

1。)System.Security.Cryptography中的.NET(Rijndael)的Microsoft .NET实现有多安全?它是否有任何已知的安全漏洞,或者我只是使用MS实现? (注意,我知道这些算法如何工作的基本背景,但我并不是那么深入了解它是如何工作的。)

2.。)由于数据与应用程序存储在同一台PC上,从C#应用程序获取信息有多难?假设我在代码中有某处

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

我知道攻击者可以直接进入汇编代码,此时我无法对此做任何事情(系统必须能够加密/解密数据),但有没有C#获取encrypPassword的快捷方式,因为它是受管理的,或者做这样的事情仍然要求你转到汇编代码?

4 个答案:

答案 0 :(得分:5)

如果您的应用程序中编译了固定密码,那么您无需关心AES的安全性和已知的安全故障,因为您的数据根本不安全。能够访问PC的知识渊博的人将能够解密所有数据。

找到固定密码通常不需要任何编程知识。一个好的十六进制编辑器在大多数情您甚至不需要知道使用了什么编程语言。

如果您的数据由单个用户使用,则可以将患者数据的密码绑定到他或她的Windows密码(或帐户)。 Windows为此提供了一些特定的功能。有关如何从.NET访问它的信息,请参阅http://msdn.microsoft.com/en-us/library/aa302402.aspx

答案 1 :(得分:1)

在回答原始问题的第一部分时 - AES的本机Windows实施已通过NIST认证,符合FIPS 140-2标准。获得认证的实施仅限于:

  1. 使用Windows加密API

  2. 使用CAPICOM com包装器加载Windows Crypto API

  3. 在System.Security.Cryptography命名空间中使用.Net AesCryptoServiceProvider类(此类在.Net Framework 3.5之前不可用)

  4. 话虽如此,RijndaelManaged类中的实现是相同的,它只是没有通过NIST认证过程(这个过程非常漫长且非常昂贵)。

    Aes算法非常安全(军用级加密 - 尤其是256位密钥变体)。

    最大的担忧(同意上面的海报)是将加密密码以纯文本形式嵌入应用程序中。

答案 2 :(得分:0)

要存储密码数据,您可以使用System.Security命名空间中的SecureString类。

答案 3 :(得分:0)

大多数体面的混淆器会在将代码存储在程序集的字符串部分之前对代码中的字符串进行加密,并在使用前注入一种解密方法。这些技术早已被反汇编者逆向设计。

实际上,几乎没有办法真正安全地将字符串存储在任何编程语言中。有人几乎总能找到字符串,或者反向工程用于构建它的逻辑。你能做的最好的事情就是让攻击者长时间陷入困境,使其不值得花费时间和精力。

在您的情况下,我可能会存储在应用程序中加密的密码(如同在应用程序外部手动加密,并将其复制/粘贴)。可能将其拆分为多个部分,因此不会将其存储为单个字符串。然后将它重新组合在一起并在运行时解密,然后在运行时将其存储在SecureString中。同时投资一个好的混淆器,因为它将帮助掩盖你的解密逻辑(这将成为安全中的薄弱环节)。