2012-03-01 97 views
48

我正在寻找一种方法在WP7应用程序中安全地存储API密钥。密钥是一个字符串,目前被硬编码到代码中(见下文)。我知道有个反射器程序的人可以很容易地看到这个。有没有更好的方式来打包这个键作为我的应用程序的一部分?资源会更安全吗?如何在C#中安全地嵌入静态字符串(键)?

string key = "DSVvjankjnersnkaecjnDFSD44VDS23423423rcsedzcadERVSDRFWESDVTsdt"; 

(这其实不是关键;))

预先感谢您。

+0

您可以将这些类型的数据存储在.config文件中 – 2012-03-01 08:05:04

回答

21

看一看Safeguard Database Connection Strings and Other Sensitive Settings in Your Code,这是一个很好看的。您的问题位于“应用程序源代码中的隐藏键”部分。

摘录:

如果定义应用程序的关键,除了混淆组装,尽量不实际的密钥字节存储的源代码。相反,使用持久特性(例如加密算法,密钥大小,密码短语,初始化向量和盐)(请参阅Encrypt and Decrypt Data Using a Symmetric (Rijndael) Key上的示例)来实现密钥生成逻辑。这将引入一个额外的间接层,所以通过简单地从应用程序二进制转储符号将无法访问该密钥。只要您不更改密钥生成逻辑和密钥特征,则最终密钥保证是相同的。最好不要使用静态字符串作为密钥生成特性,而是动态构建它们。另一个建议是以与数据存储应该相同的方式处理程序集,即通过应用适当的ACL。只有使用此选项作为最后手段时,其他数据保护技术都不起作用,而您的唯一选择是保留敏感数据未加密。

+9

您是否介意在此处总结内容?这将使得答案作为一个独立单元更有价值(例如,如果链接过时)。 – 2012-03-01 10:20:17

+2

好点。我将总结下班后描述的步骤。 – maka 2012-03-01 10:24:57

5

您可以使用ProtectedData加密Api密钥,然后在运行时将其解密。这是很好的教程如何将数据在Windows Phone的加密:Encryption in Mango

+1

我试过了,但事实证明,您无法使用ProtectedData在一台计算机中加密某些内容,并在另一台计算机中对其进行解密。正如你可以看到以下内容:http://stackoverflow.com/questions/23124000/unable-to-decrypt-data-on-second-computer – Entrodus 2015-11-18 10:19:24

0

可能是你可以用手之前对它进行加密并将其保存在app.config中。在阅读时使用相同的算法对其进行解密。

0

这不是可能的答案,但相信这是一个建议:

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

  1. 使用两个正确的字符串加密/解密算法,比如算法x和y。在app.config中
  2. 认沽加密的数据库密码,将其发布之前。
  3. Decypt的app.config密码(ALGO Y)来连接数据库采取新encrpyted字符串(真实的)。
  4. 关闭连接,并与算法x如果反射器/等decyrpt新的字符串。没有运行。
  5. 使用它。
  6. 处置保存字符串的对象。
+1

算法的选择(这是通过反射暴露)没有问题,但关键管理。例如,你不在步骤#3中说明密钥存储在哪里。所以即使有人实施了你的建议,他们仍然会有OP的问题。你在哪里存储密钥? – 2012-03-01 15:38:28

+0

将加密密钥存储在数据库中。并在app.config中存储加密的“db密码”。无论如何,我更新了我的答案。 (如果开发人员在他的应用程序中使用硬编码的自定义加密算法,然后对其进行混淆,则通过反射将其暴露出来是非常困难的。) – 2012-03-01 15:47:05

+0

@LostInLib:Conrad可能指的是解密app.config密码所需的密钥。 – Groo 2012-03-06 08:38:09

10

我已经通过所有这些答案看完了,我不觉得有什么,你可以安全地嵌入此任何方式 - 无论你把它在哪里,或者你是如何混淆它的。只要它在您的XAP中并在应用程序中解码,那么它将始终可供黑客入侵。

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

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

相关问题