如何处理公共Git仓库中的敏感数据?

24

当你将代码存放在公共的git代码库中时,如何处理像secret API keys、hash salts等敏感数据呢?

显然,在代码中保留敏感信息会使其受到威胁。

另一种解决方法是不在代码中硬编码秘密信息,而是将其存储在一个独立的文件中并将该文件添加到.gitignore中。这种方法的缺点是当有人首次拉取您的代码时,秘密信息将丢失,并且无法直接运行。可以通过在代码中编写“初始化”函数来解决此问题,但这样会让git系统进入您的代码中,这并不是一个好的做法。

另外一种解决方案是创建一个“默认”的秘密信息文件,将其提交到项目开始时,然后使用自己的信息而不进行提交。但这可能会导致git在拉取时抱怨您有未提交的更改。

那么,处理此类问题的通用方法是什么?


5个回答

11
尝试使用.gitattributes来为已配置加密/解密过滤器的路径进行设置:
*secure.yml filter=crypt

并在 .git/config 中添加加密过滤器的配置:

[filter "crypt"]
    clean = openssl enc ...
    smudge = openssl enc -d ...
    required

4

可以说,您不应该把这些属性硬编码到您的源代码中,因为管理员将希望有选项在给定的系统上更改它们。如果这些属性在一个属性文件中(例如在您的主目录中),则问题得以解决。

对于可能遇到麻烦的用户,您可以检查一个默认文件,他们可以复制到自己的家目录并进行修改。如果错误消息和自述文件清楚地说明了缺少此特定文件的情况,那么这个设置将非常有效。


3
如果有人需要在他们的Android项目中使用,这里有我发现的最简单的方法:
步骤1: 创建:res/values/secrets.xml,其中包含以下内容:
<!-- Inside of `res/values/secrets.xml` -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="parse_application_id">xxxxxx</string>
    <string name="parse_client_secret">yyyyyy</string>
    <string name="google_maps_api_key">zzzzzz</string>
</resources>

步骤2:在代码或XML文件中使用
getString(R.string.parse_application_id),
getString(R.string.parse_client_secret)

或者
<meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="@string/google_maps_api_key"/>

步骤三:将以下内容添加到 .gitignore 文件中。
 **/*/res/values/secrets.xml

以下是完整的文章


2
最佳解决方案是使用私有的git子模块和公共的git存储库。
更多信息请参见此问题,以下是一个很好的引用:

当您排除或忽略文件时,只是防止这些文件被添加到您的存储库中。敏感文件都不在存储库中,而是在您的工作目录中。


0

“默认”秘密信息文件是个好主意,但是即使你忽略了这个文件,也无法避免git警告。从github帮助页面中可以看到:

如果在一个文件被添加到ignore规则之前已经被跟踪过了,那么git就不会忽略它。在这种情况下,通常需要使用git rm --cached filename来取消跟踪该文件。

因此,添加一个“虚拟”的或者“默认”的文件然后再忽略它并不能防止警告。虽然这种方法可行,但是很不方便,因为你必须手动从每个提交中排除敏感文件。

取消跟踪文件会将其从Github中删除,这违背了最初拥有该文件的目的。

也许子模块建议会起作用。


1
git update-index --assume-unchanged <file> 可以用于忽略已跟踪文件中未提交的更改。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接