我如何安全地在C#中embedded静态string(键)?

我正在寻找一种方法来安全地将API密钥存储在WP7应用程序中。 关键是一个string,目前是硬编码到代码(见下文)。 我知道有一个reflection器程序的人可以很容易地看到这一点。 有没有更好的方法来打包这个键作为我的应用程序的一部分? 资源会更安全吗?

string key = "DSVvjankjnersnkaecjnDFSD44VDS23423423rcsedzcadERVSDRFWESDVTsdt"; 

(这实际上不是关键;))

先谢谢你。

看看你的代码中的Safeguard数据库连接string和其他敏感设置 ,这是一个很好的阅读。 您的问题是在“应用程序源代码隐藏键”部分。

摘抄:

如果在应用程序中定义密钥,除了混淆程序集之外,请不要将实际的密钥字节存储在源代码中。 而是使用持久性特性(如encryptionalgorithm,密钥大小,密码短语,初始化向量和盐)(请参阅使用对称(Rijndael)密钥的encryption和解密数据的示例)来实现密钥生成逻辑。 这将引入一个额外的间接层,所以通过从应用程序二进制文件中简单地转储符号将无法访问该密钥。 只要不改变密钥生成逻辑和密钥特征,所得到的密钥就保证是一样的。 不使用静态string作为密钥生成特性也是一个好主意,而是在运行时build立它们。 另一个build议是以与数据存储应该相同的方式处理程序集,也就是应用适当的ACL。 只有使用这个选项作为最后的手段,当没有其他的数据保护技术的工作,你唯一的select是保持敏感数据未encryption。

我已经阅读了所有这些答案,我不认为有什么方法可以安全地embedded – 无论你把它放在哪里,或者如何混淆它。 只要它在你的XAP和应用程序内解码,那么它总是可以被黑客利用。

如果您需要在合理的保护范围内将密钥发送给xap,那么我认为@ maka的答案会产生最好的结果 – 尽可能地对其进行混淆 – 但不要认为这会使您的安全 – 即不要为您的手机银行应用程序做这个!

或者,如果您确实需要安全性,则不要单独在应用程序中运行 – 也请使用Web服务器。 例如,如果你正在做一个Facebook应用程序,并需要以某种方式保护你的Facebook密钥,那么你需要将用户从你的应用程序redirect到服务器上的网页进行身份validation。 那么这个网页就需要引导用户完成获取访问令牌的过程 – 然后只要访问令牌(和公共appid一起)就需要返回到你的应用。 对于那些需要知道密钥的networking服务来陪伴每一个电话,恐怕每一个电话都可能需要通过你的服务器。

您可以使用ProtectedDataencryptionApi密钥,然后在运行时对其解密。 这是一个很好的教程如何encryptionWindows Phone中的数据: 在芒果encryption

也许你可以先把它encryption并保存在app.config中。 在阅读时使用相同的algorithm对其进行解密。

你可以使用DotFuscator来禁用使用reflection器的function。 但是,这不会允许您在不重新编译的情况下更改密钥。

在过去,我在其他(基于web / winform的)软件中使用了以下方法:

http://weblogs.asp.net/jgalloway/archive/2008/04/13/encrypting-passwords-in-a-net-app-config-file.aspx

也许这不是一个答案,但肯定是一个build议:

将encryption密钥存储在数据库中。 并在app.config中存储encryption的“db密码”。

  1. 使用两个正确的stringencryption/解密algorithm,比如algorithmx和y。
  2. 将encryption的数据库密码放在app.config中以发布它。
  3. 解密app.config密码(algo y)连接数据库以获取新的encryptionstring(真实的)。
  4. 如果reflection器/等,closures连接并用algorithmx确定新的string。 没有运行。
  5. 用它。
  6. configuration包含该string的对象。