如何在我的开源项目中隐藏机密数据?


13

我有一个开源项目,可以将文件上传到多个文件主机中的DropBox。现在,我正在抓取DropBox的屏幕。要使用他们的API,我必须对他们提供给我的SECRET KEY进行硬编码,以进行OAuth身份验证。但我担心,如果任何人都可以清楚地看到该密钥,它就不会是秘密的。

恶意软件的人有可能使用我的密钥将病毒上传到用户的帐户(已经允许访问我的应用程序),该帐户会传播到他们的PC(如果启用了桌面同步)和其他人的PC(如果他们有共享文件夹)等等。:O

我发现这个未解决的问题与我的问题相同。

但是我想大体上知道在公开源代码项目中如何隐藏机密数据。

我有一个主意。

  • 源代码中是否有占位符,例如“ <SECRET KEY HERE>”,并且仅在构建要发布的二进制文件时才占位?(y!)

有什么体面的主意吗?


1
这确实是唯一安全的方法。您也可以使用pgp加密对您的密钥进行编码,然后只有您可以对其进行解码,但是为什么还要麻烦发布它。
Prescott

可能想检查一下这个问题:programmers.stackexchange.com/questions/180957/…-与DropBox API密钥无关,但一般信息是相同的。
tdammers 2012年

git-crypt已经为您制作了:) github.com/AGWA/git-crypt
2014年

Answers:


14

基本思想是不要在代码或已编译的二进制文件中签入机密值。特别是如果该项目是开源的,那么您实际上不应该这样做。您可以采取几种配置策略来做到这一点:

代码中的占位符(硬编码值)

如建议的那样,代码中的占位符在动态编程语言中最理智,最容易做到,因为代码易于更改(无需编译)。我已经看到很多开放源代码项目都在使用MediaWiki之类的工具,例如MediaWiki LocalSettings.php

这种策略缺点是密钥是硬编码的。因此,如果程序以二进制形式分发,则对密钥进行硬编码不会使其特别易于维护。

配置文本文件

您也可以通过实现配置文本文件来执行此操作,即程序/应用程序搜索配置文件并从中读取值。您可以使用占位符签入示例配置,但是在计算机中具有本地的实际配置。

在您的情况下,您可以key.conf使用实际的密钥创建文本文件,让程序使用该文件,并由版本控制将其忽略。为了帮助您,您可以key.conf.example使用伪造的密钥检入文本文件并检入。确保您的程序/应用程序发出有用的错误消息,以使用户将实际密钥添加到正确的文件中。

某些编程语言具有可以自动为您提供此功能的API,例如:

如果您的应用程序是数据库应用程序,请考虑将密钥或其他配置变量放入数据库中。它与上面的配置文本文件相同,但是您将所有配置变量(例如键)放在数据库表中。

通过首选项视图或后台应用程序

如果程序是带有视图的窗口或Web应用程序,则还可以通过各种首选项视图让应用程序创建配置文件。这样一来,您无需像上面建议的那样检入示例配置文件。

MediaWiki通过LocalSettings.php在初始安装过程中自动生成文件来解决此问题。

不可否认,对于仅作为后台进程,服务或守护程序运行的程序,这不是一种选择。但是,这就是为什么您在通常称为Back Office应用程序的 Web应用程序中为这些应用程序创建单独的GUI项目以创建管理和首选项设置的入口点的原因。


这里要注意的一件事:让应用程序本身修改其自己的配置设置意味着设置文件必须可由应用程序的用户写入,这反过来又增加了攻击面,因此您应该认真考虑是否真的需要这样的UI。
tdammers

2

最简单的方法是根本不发布机密数据。一些选项:

  • 使用类似问题中的占位符。
  • 特别是对于密钥使用头文件,不要将其提交给源代码管理,而只能将其私下分发给受信任的各方。

我已经使用了第二种方法进行开源开发,因为这意味着您不必担心在构建之前就填写细节,也不必担心更改不要提交。


2

如果有人拥有源代码(或可以进行反向工程的字节码),那么他们将能够通过在调试器中运行代码,并在发送密钥的位置放置一个断点来获取密钥。

您可以通过提供一个与投递箱对话的预编译C库(使用其中已编码的键)来使其更难一些,但是仍然有很多方法会泄漏键(例如,我在考虑字符串)。

我可以想到的唯一安全的方法是提供一种将服务发布到投递箱的Web服务。这样,密钥就可以在您的控制下保留在您的服务器上。托管和带宽成本意味着该解决方案对于免费应用程序而言并非理想选择,但是额外的好处是,您的服务器可以在将客户端的文件中继到Dropbox之前正确地对客户端进行身份验证。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.