如何在C#中安全地嵌入静态字符串(键)?

如何在C#中安全地嵌入静态字符串(键)?,c#,.net,string,windows-phone-7,c#-4.0,C#,.net,String,Windows Phone 7,C# 4.0,我正在寻找一种在WP7应用程序中安全存储API密钥的方法。密钥是一个字符串,当前硬编码到代码中(见下文)。我知道有反射器程序的人可以很容易地看到这个。是否有更好的方法将此密钥打包为我的应用程序的一部分?资源是否更安全 string key = "DSVvjankjnersnkaecjnDFSD44VDS23423423rcsedzcadERVSDRFWESDVTsdt"; (实际上这不是钥匙;)) 提前谢谢。看一看,这本书读得很好。您的问题位于“在应用程序源代码中隐藏密钥”部分 摘录: 如果在

我正在寻找一种在WP7应用程序中安全存储API密钥的方法。密钥是一个字符串,当前硬编码到代码中(见下文)。我知道有反射器程序的人可以很容易地看到这个。是否有更好的方法将此密钥打包为我的应用程序的一部分?资源是否更安全

string key = "DSVvjankjnersnkaecjnDFSD44VDS23423423rcsedzcadERVSDRFWESDVTsdt";
(实际上这不是钥匙;))

提前谢谢。

看一看,这本书读得很好。您的问题位于“在应用程序源代码中隐藏密钥”部分

摘录:

如果在应用程序中定义密钥,除了混淆程序集之外,请尝试不在源代码中存储实际的密钥字节。相反,使用持久性特征实现密钥生成逻辑,例如加密算法、密钥大小、密码短语、初始化向量和salt(请参见中的示例)。这将引入额外的间接层,因此不能通过简单地从应用程序二进制文件中转储符号来访问密钥。只要不更改密钥生成逻辑和密钥特征,生成的密钥就保证是相同的。也可以不使用静态字符串作为密钥生成特征,而是动态构建它们。另一个建议是以与处理数据存储相同的方式处理程序集,即通过应用适当的ACL。而且,只有在其他数据保护技术都不起作用且您唯一的选择是不加密敏感数据时,才将此选项用作最后手段


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

可能是您可以事先加密数据并将其保存在app.config中。在读取时,使用相同的算法对其进行解密。

您可以使用它禁用使用reflector的功能。 但是,这将不允许您在不重新编译的情况下更改密钥

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


这可能不是答案,但肯定是建议:


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

  • 使用两种合适的字符串加密/解密算法,比如算法x和y
  • 在发布之前,将加密的db密码放入app.config
  • Decypt app.config密码(algo y),用于连接数据库以获取新的加密字符串(真实字符串)
  • 如果reflector/etc未运行,请关闭连接并使用算法x删除新字符串
  • 使用它
  • 处置保存字符串的对象

  • 我已经通读了所有这些答案,我不认为有任何方法可以安全地嵌入它-不管你把它放在哪里,或者你如何混淆它。只要它在您的XAP中,并在应用程序中解码,那么它将始终可用于黑客攻击

    如果您需要在xap中提供具有合理保护程度的密钥,那么我认为@maka的答案会产生您的最佳选择-尽可能模糊它-但不要认为这会使您安全-即不要为您的移动银行应用程序这样做


    或者,如果你真的需要安全性,那么不要只在应用程序中操作,也要使用web服务器。例如,如果您正在使用Facebook应用程序,并且需要以某种方式保护您的Facebook密钥,那么您需要将用户从应用程序重定向到服务器上的网页进行身份验证。然后,该网页将需要引导用户完成获取访问令牌的过程,然后仅该访问令牌(连同公共appid)将需要返回到您的应用程序。对于那些每次调用都需要知道密钥的Web服务,恐怕每次调用都需要通过您的服务器。

    您可以将这些类型的数据存储在.config文件中。您介意在这里总结一下内容吗?这将使答案作为一个独立的答案更有价值(例如,在链接过时的情况下)。这种“密钥生成”范式不适用于OAuth 1或OAuth 2中的客户端机密。算法选择(通过反射公开)不是问题,而是密钥管理。例如,在步骤#3中,您没有说密钥存储在哪里。因此,即使有人实施了你的建议,他们仍然会有与OP相同的问题。您将密钥存储在哪里?将加密密钥存储在数据库中。并将加密的“db密码”存储在app.config中。我还是更新了我的答案。(若开发人员在其应用程序中使用硬编码的自定义加密算法,然后对其进行模糊处理,那个么很难通过反射将其公开。)@LostInLib:Conrad可能指的是解密app.config密码所需的密钥。我尝试过,但结果表明,您无法使用ProtectedData在一台计算机中加密某些内容,并在另一台计算机中解密。正如您在以下内容中所看到的: