繁体   English   中英

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

[英]How can I securely embed a static string (key) in C#?

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

string key = "DSVvjankjnersnkaecjnDFSD44VDS23423423rcsedzcadERVSDRFWESDVTsdt";

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

先感谢您。

查看您的代码中的Safeguard数据库连接字符串和其他敏感设置 ,这是一个很好的阅读。 您的问题位于“应用程序源代码中隐藏密钥”部分。

摘抄:

如果在应用程序中定义键,除了对程序集进行模糊处理外,请尽量不在源代码中存储实际的键字节。 相反,使用持久特性实现密钥生成逻辑,例如加密算法,密钥大小,密码短语,初始化向量和盐(请参阅使用对称(Rijndael)密钥加密和解密数据中的示例)。 这将引入一个额外的间接层,因此只需从应用程序二进制文件中转储符号就无法访问该密钥。 只要您不更改密钥生成逻辑和密钥特征,就可以保证生成的密钥相同。 不使用静态字符串作为密钥生成特性,而是在运行中构建它们也是一个好主意。 另一个建议是以与应该处理数据存储相同的方式处理程序集,即通过应用适当的ACL。 并且只使用此选项作为最后的手段,当没有其他数据保护技术工作时,您唯一的选择是保留未加密的敏感数据。

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

如果你需要在xap内部以合理的保护程度发送密钥,那么我认为@maka的答案会产生你最好的选择 - 尽可能地混淆它 - 但不要认为这会让你安全 - 即不要为您的移动银行应用程序执行此操作

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

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

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

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

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

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

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

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

  1. 使用两个正确的字符串加密/解密算法,假设算法x和y。
  2. 将加密的db密码放在app.config中,然后再发布它。
  3. decypt app.config密码(algo y)连接数据库以获取新的加密字符串(真正的一个)。
  4. 如果反射器/等,关闭连接并使用算法x解密新字符串。 没跑
  5. 用它。
  6. 处理保存字符串的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM