C源代码中的密码加密

C源代码中的密码加密,c,cryptography,passwords,C,Cryptography,Passwords,有没有一种方法可以保存一个静态密码,而在编译后的应用程序中很难找到这种方法 我需要两个不同的应用程序。一个是用于Windows的轻量级FTP客户端,它只连接到一个硬编码服务器。 另一个是Objective C游戏,让用户创建关卡包并使用密码保存。它们可以在没有密码的情况下播放,但不能在关卡编辑器中打开。我正在用AES加密密码,但我必须以某种方式保存密码以便解密 到目前为止,我唯一的想法是将密码保存为多个字符串,而不是一个字符串。这对游戏来说非常有效,因为我可以连接已经存在的字符串。或者我可以将其

有没有一种方法可以保存一个静态密码,而在编译后的应用程序中很难找到这种方法

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

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


有没有更安全的方法可以做到这一点?

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

您所能做的是类似于(正确实现的)web应用程序如何验证登录信息(该信息存储在数据库中)的方法。只需以哈希形式存储密码。通常,方法是使用MD5+盐()。您可以做的不是传输或存储明文密码,而是对用户输入进行散列,并根据存储的散列值检查散列。匹配的哈希对应于匹配的密码

编辑

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

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


是的,人类制造的一切都可以被另一个人打破绝不使用可逆算法存储敏感数据-它们将被反向工程。正如sidran32所写,您可以存储散列,但它对客户端没有帮助

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

$strings <binary>
$strings
将密码存储在代码中永远不会起作用:您可以按自己喜欢的方式拆分密码、编码密码、加密密码——有时您需要重新组装部件以验证密码。这正是攻击者可能通过调试器钩住的地方。我对一个类似的问题作了详细的回答


唯一真正安全的方法是将密码作为带外信息存储在代码(或二进制)之外。正如数以百万计被破解的Microsoft或其他产品所证明的那样,您心目中的这类DRM在更长的时间内都不会工作。

我想一种非常简单的方法仍然可以有效地防止基本的资源检查,那就是用一个数字(单独保存)保存密码字符串XOR'd。然后用相同的数字对其进行异或运算以“解密”。这对反编译和内存检查都不起作用,特别是当你将解码后的字符串存储在内存中任何时间的时候。这就是将不同的字符串放在一起或用数字进行异或(XOR)之类的事情,对吗?我想我会对一些字符串进行异或运算,如果有人正在寻找密码,我会使用听起来不像密码的单词。我不想花太多的心思,因为如果攻击者在自己的系统上安装了应用程序,似乎每个加密都会被破坏。不过,非常感谢您的提示,比如不要在内存中保存解码字符串太长:)@Alex因为您无法安全存储密钥,我建议不要使用真正的加密,因为寻找加密方法会很快找到您的密钥和加密密码。XOR的使用已经足够隐蔽,这使得查找模糊字符串变得(稍微)困难。我希望您的安全性不依赖于您的用户不知道这个密码,因为如果他们足够关心,无论您采取什么步骤来模糊它,他们都会不可避免地知道。谢谢您的回答。这可能适用于游戏中的密码,但不适用于FTP应用程序或等级代码,我甚至没有提到这一点。我的坏:)修改下来,至于FTP,你要么使用散列作为密码,这相当于纯文本,要么密码本身,散列是一种方式…没有意义。散列在这里没有帮助。@CodeInChaos如果能够访问FTP服务器的源代码以实现密码验证,则散列会很有用,但他没有。我没有提到那个案例,因为我在回答中遗漏了那个要求…@sidran32,在那个案例中它有什么用处?这不会以任何方式帮助您隐藏客户端上的密码,您只是用“密码”重新定义了您所理解的内容。OPs的问题是,他想要的东西实际上无法实现。我知道strings命令,但我想如果我选择了一个看起来不像密码的密码,人们将永远找不到它。它如何与调试器一起工作?你能在内存中找到字符串吗,即使我立即释放它而且,正如我所说的,我意识到如果有人真的想找到级别代码,他们可以——我的意思是,只要付出足够的努力,所有的加密都可以被破解。我只是在寻找一个不值得麻烦的解决方案。@Alex,因为您可以注入
\uu asm{int 3}调用任何可执行文件的反汇编,甚至只是以某种方式闯入运行,攻击者可以让程序在程序流中的任何点处于基本暂停状态。如果该字符串在任何时候都以完整的形式存在于内存中,那么即使您快速释放它,它也是易受攻击的。而且,即使它被释放,字符串仍将保留在内存中,直到程序(或其他程序)写入该内存位置。这就是他的意思。哦,好吧,我不知道。那么在任何情况下,密码都可以在什么地方找到,10