分解C#
我有一个关于C的问题 我目前正在开发一个医疗软件产品,其中一个重要的事情是确保患者的数据被加密。关于这一点,我有两个问题: 1.)System.Security.Cryptography中的Microsoft.NET AES(Rijndael)实现的安全性如何?它是否有任何已知的安全缺陷,或者我仅仅使用MS实现就可以了?(注意,我知道这些算法如何工作的基本背景,但我并没有深入了解它是如何工作的) 2.)由于数据与应用程序存储在同一台PC上,从C#应用程序获取信息有多困难?假设我在代码中有什么地方分解C#,c#,security,C#,Security,我有一个关于C的问题 我目前正在开发一个医疗软件产品,其中一个重要的事情是确保患者的数据被加密。关于这一点,我有两个问题: 1.)System.Security.Cryptography中的Microsoft.NET AES(Rijndael)实现的安全性如何?它是否有任何已知的安全缺陷,或者我仅仅使用MS实现就可以了?(注意,我知道这些算法如何工作的基本背景,但我并没有深入了解它是如何工作的) 2.)由于数据与应用程序存储在同一台PC上,从C#应用程序获取信息有多困难?假设我在代码中有什么地方
string encrypPassword = "ThisIsMyPassword";
string encryptedString = EncryptString(ClearString, encrypPassword);
// save encryptedString to harddrive
我知道攻击者可以直接进入汇编代码,在这一点上,我对此无能为力(系统必须能够加密/解密数据),但C#是否有一条捷径可以获取encrypPassword,因为它是被管理的,或者像这样的事情仍然需要你去汇编代码吗?如果你有一个固定的密码编译到你的应用程序中,那么你就不需要关心AES的安全性和已知的安全错误,因为你的数据根本不安全。一个有足够知识的人能够访问PC,将能够解密所有数据 定位固定密码通常不需要任何编程知识。在大多数情况下,一个好的十六进制编辑器就可以了。您甚至不需要知道使用了什么编程语言
如果您的数据由单个用户使用,则可以将患者数据的密码绑定到他或她的Windows密码(或帐户)。Windows为此提供了一些特定的功能。有关如何从.NET访问它的信息,请参阅。要存储密码数据,您可以使用System.Security命名空间中的SecureString类。大多数优秀的混淆器会在将代码中的字符串存储到程序集的字符串部分之前对其进行加密,并在使用之前插入一个方法对其进行解密。这些技术也早已被反汇编程序逆向工程 实际上,几乎没有办法在任何编程语言中真正安全地存储字符串。有些人几乎总是可以找到字符串,或者对用于构建它的逻辑进行反向工程。你能做的最好的事情就是把攻击者压得足够长,使其不值得他们花费时间和精力
在您的情况下,我可能会将加密的密码存储在应用程序中(如,在应用程序外部手动加密密码,然后复制/粘贴)。可能会将其拆分为多个部分,这样就不会将其存储为单个字符串。然后将其放回一起并在运行时取消加密,然后在运行时将其存储在SecureString中。另外,还要投资一个好的模糊器,因为它将帮助屏蔽您的未加密逻辑(这将成为安全性中的薄弱环节)。在回答您原始问题的第一部分时,AES的本机Windows实现经NIST认证符合FIPS 140-2。对认证实施的访问仅限于:
最大的问题(同意上面的海报)是将加密密码以明文形式嵌入到应用程序中。第2点可能重复)是您的主要问题,不要担心1)。您可以查看DPAPI,例如:@HenkHolterman,从汇编代码本身的散列中得到一些熵是否有效?@Jodrell-我看不出这有什么帮助。可能是种子或IV,但肯定不是密钥。
SecureString
有一些优点,但很少相关。OP有更大的问题,SecureString
无法解决。@Jodrell它甚至不能阻止读取字符串。它只针对一些特定的威胁提供保护,例如错误转储和交换文件。如果您想自己尝试,请使用ILDASM或reflector(都是免费的)来查找您的密钥。你会发现把它从二进制文件中取出来很简单。