在C源代码中加密密码

时间:2012-03-28 16:28:28

标签: c cryptography passwords

有没有办法以一种在编译的应用程序中很难找到的方式保存静态密码?

我需要两个不同的应用程序。一个是Windows的轻量级FTP客户端,只连接到一个硬编码服务器。 另一个是Objective C游戏,它允许用户创建级别包并使用密码来保存它们。它们可以在没有密码的情况下播放,但不能在关卡编辑器中打开。我正在使用AES加密密码,但我必须以某种方式保存密码以进行解密。

到目前为止,我发现的唯一想法是将密码保存为一个字符串,而不是多个字符串。这对游戏来说非常有效,因为我可以连接已经存在的字符串。或者我可以将其保存为长字符串并使用秘密算法从该字符串中获取密码 - 尽管这引出了一个问题:Windows上的C应用程序或OS X上的Cocoa应用程序是否可以被反编译以找到该算法?

有更安全的方法吗?

3 个答案:

答案 0 :(得分:2)

  

Windows上的C应用程序或OS X上的Cocoa应用程序可以简单地反编译以找到该算法吗?

是的,所有由人类制造的都可以被另一个人打破。 从不使用可逆算法存储敏感数据 - 将进行逆向工程。您可以存储哈希值,如sidran32所写,但它对客户端没有帮助

答案 1 :(得分:2)

为什么要经历反编译的痛苦 - 一个简单的

$strings <binary>

会做到这一点:)在代码中存储你的密码永远不会起作用:你可以拆分它们,对它们进行编码,以你喜欢的方式对它们进行加密 - 当你需要重新组装部件以便验证他们。这正是攻击者可能会使用调试器进入的关键点。我给了一个answer类似问题的详细信息。

唯一真正安全的方法是将密码存储为代码外的带外信息(或者就此而言的二进制文件)。您想到的这些DRM永远不会工作很长一段时间,因为数以百万计的破解微软或其他产品证明了这一点。

答案 2 :(得分:-2)

字符串文字通常保留并存储在二进制文件中的某处,即使在编译的C源代码中也是如此。

您可以采用的方法类似于(正确实施)Web应用程序如何验证登录信息的方式,该信息存储在数据库中。只需以密码形式存储密码即可。通常,该方法是使用MD5 +盐(here is a description and some sample PHP code)。您可以做的不是传输或存储明文密码,而是散列用户输入并根据存储的哈希值检查哈希值。匹配哈希对应于匹配密码。

修改

但这对FTP服务器的情况没有帮助,因为你无法修改它的源代码......