【问题标题】:Storing sensitive data within the source of compiled programs在编译程序的源中存储敏感数据
【发布时间】:2026-01-08 07:35:01
【问题描述】:

this libcurl 的使用示例中,为简洁起见,程序将使用用户和密码字符串“登录”到 IMAP 服务器,密码字符串存储在源中的两个单独字符串中。大多数真实的电子邮件客户端(gnus,mutt)从纯文本配置文件或加密文件中读取,如果我要使用真实的用户名和密钥编译示例文件,是否可以反编译生成的二进制文件以解析私有钥匙?我想在编译前输入宏的私钥比编译后读取配置文件更安全,这种理解正确吗?

【问题讨论】:

  • 如果您使用宏,那么私钥将被烘焙到可执行文件中。您不一定需要对可执行文件进行反编译,但有一些专业知识的人可以将其读出。在运行时加载私钥可以解决这个问题。
  • 因为它们是字符串文字,你甚至不需要反编译它。 linux.die.net/man/1/strings 很容易打印出来。

标签: c libcurl decompiling


【解决方案1】:

如果用户名和密码是字符串并且只是包含在源代码中,则可以从二进制可执行文件中提取它们,甚至无需反编译。请参阅strings 命令。您可以采取措施在源代码中包含用户名和密码,以便strings 不容易找到它们(例如,通过在添加之前将字符串与程序中的其他位模式进行异或,然后在可执行文件中进行异或以恢复原本的)。但是,这是“通过默默无闻的安全”,不建议这样做。

将用户名和密码放在配置文件中可以让您使用系统的文件权限,这样使用二进制文件的人可能不一定有读取文件的权限。您还可以设置 PKI 身份验证安排,或者可能使用 Kerberos 密钥授权。

要付出多少努力取决于您要保护的东西的价值。

【讨论】:

  • 徒劳无功,编译的二进制文件(以及为了额外的安全性源)不能由编译它的用户修改其权限,以便只有他可以访问它吗? IE。在 linux 上,这意味着为只有当前用户的个人二进制文件创建一个组,并在其上使用 chmod 640
  • @BitthovVinu 是的,但是任何特权用户(sudo)都可以看到密码。此外,只有用户才能执行程序——并且用户可能已经知道用户名和密码,因此您不需要将它们包含在二进制文件中,除非您将应用程序提供给其他人使用。
  • 我创建了一个只有我的自定义用户所在的新组 - 相应地更改了权限。当我切换到 root(使用 su)时,我尝试运行可执行文件并且权限被拒绝 - 我创建了一个与 sudo 完全不同的组。
最近更新 更多