7

我有一个关于 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,因为它是托管的,还是这样的事情仍然需要你去汇编代码?

4

4 回答 4

5
于 2012-10-22T11:13:11.847 回答
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 之前才可用)

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

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

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

于 2012-10-22T11:51:26.210 回答
0

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

实际上,几乎没有办法在任何编程语言中真正安全地存储字符串。几乎总有人可以找到字符串,或者对用于构建它的逻辑进行逆向工程。您能做的最好的事情就是让攻击者足够长的时间,以使其不值得他们花费时间和精力。

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

于 2012-10-22T11:49:24.613 回答
0

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

于 2012-10-22T11:27:27.023 回答