在编译的应用程序中隐藏密码/密钥

时间:2011-09-06 11:36:53

标签: c cryptography

在我的C应用程序中,我有一个解密密钥,用于解密数据库中的集合(用户名/密码)。目前,我只是用

声明它
char * key = "$$$secretSampleDecryptionKey$$$";

在该行之后不久,我准备SQL语句,然后从DB中选择。我的问题是,如果有人要调试我编译的应用程序或解组它,他们真的会看到密钥吗?我该怎么做才能将它们隐藏起来?

编辑:

Mark和Aaron指出,我可以简单地使用Linux / Unix字符串命令

strings nameOfApplication

打印出我的应用程序中的所有字符串,包括“秘密”密钥。

编辑2:

应用程序在我的服务器上运行,数据库存储加密的敏感客户数据。我认为我玩的是安全的,因为没有文本文件中的密钥供所有人阅读,而是编译它。

5 个答案:

答案 0 :(得分:8)

一个有趣的链接,涉及从二进制文件中检索密码的人的故事:

Deconstructing an ELF File

这是对某人可能尝试发现密码的逐步说明。它会让你知道什么是“不该做”。例如,使用命令strings是列表中的第一项。

如果要隐藏strings中的秘密字符串,可以将其存储为不以\0字符终止的字符串数组。 strings不应该捡起来。

还有一个很好的技巧(被绕过),以避免有人在你的二进制文件上使用strace / ltrace。

最终通过反汇编代码,“黑客”设法检索密码,正如其他人指出的那样难以防范密码。基本上你不能真正隐藏二进制文件......

答案 1 :(得分:3)

如果密钥位于您的来源中,则攻击者能够找到它。你能做的最好的事情就是让它们变得更加困难。

存储的密钥不应该是文本,而应该是二进制文件。这样就可以避免搜索字符串。假设您的密码存在于代码中,您的用户无需输入密码。

将密钥存储在至少两个随机查看的二进制数组中,这些二进制数组一起进行异或,以生成实际密钥。或者,选择应用程序中存在的标准文本字符串之一,例如:“请输入Zipcode:”,并将其用作您的密钥,或作为XOR的一个组件。如果需要,散列这样的消息会使其达到标准长度。

答案 2 :(得分:1)

使用调试器/反汇编程序,用户始终可以找到密码。你可以更难(例如use obfuscation),但并非不可能。

如果您确实有秘密(即解密数据所需的私钥),您可以在智能卡上执行解密。

在有关用户名和密码的方案中,您可能只是将密码哈希存储在数据库中(请参阅Best way to store password in database中的引用答案)

答案 3 :(得分:1)

  

有人能看到吗?

命令strings将显示字符串,无需反汇编应用程序。

反汇编只会让识别15'000个字符串中的哪一个更加简单key

  

我该怎么做才能将它们隐藏起来?

只有一个解决方案:不要把它放在代码中。

相反,请使用许可证密钥或类似技术,用户知道密钥。

答案 4 :(得分:1)

我想知道是否有人可以给我们一个真正的答案来解决这个问题。根据我作为网络开发者的经验,我可以告诉你,你给客户的东西不再属于你了。考虑一个网站在服务器端使用一些加密算法,在客户端使用硬编码的javascript技术,而webdev本身,由他自己的虚荣心引导,不想向世界展示它,但仍然要使用由客户,事实上。

在这种情况下,他能做什么?是的,是的,他可以想出把他的脚本放在基于setTimeout的无限循环中,所有这些都是匿名函数,所以它无法跟踪,但仍然必须在某处完成初始化,代码必须是visibile,更多,他决定以加密的方式在加载后发送代码,但是,在客户端你仍然必须有解密密钥,所以想要这些信息的人仍然会有这个难题的两个必要部分。但我们的程序员是坚持不懈的,所以他每次创建解密函数只匹配一个加密的字符串,但它仍然没有好处。因为客户端仍然具有字符串和匹配功能。

他能做的任何事情就是找到一种方法来使用环境,这样该函数只能使用一次,之后代码将过期作为字符串,以及永远丢失的真实信息。而最重要的是以这样的方式使用环境,使得解密函数的执行上下文不能伪造

我知道我没有回答你的问题,但我指出了你提到的问题的一些重要细节。如果您使用C,必须有一些工具可以使用,例如使用某些内存状态或实际系统操作创建上下文,以获得无法伪造的内容。

编辑1: 您可以在代码中根据执行情况创建一个有趣的多米诺骨牌效应,因为在需要时您将完全拥有它,但它不会存储在已编译文件的文件或字符串中,因此它只能在运行时找到它,它只能在某些特定条件下找到,而且可能需要一些hrd逆向工程来获取它。可能是一个很好的解决方案。

非常尊重, 保罗