您如何处理公共 git 存储库中的敏感数据?

Posted

技术标签:

【中文标题】您如何处理公共 git 存储库中的敏感数据?【英文标题】:How do you handle sensitive data in a public git repo? 【发布时间】:2012-03-22 07:17:30 【问题描述】:

当您将代码保存在公共 git 存储库中时,您如何处理敏感数据,例如秘密 API 密钥、哈希盐?

显然将敏感数据保留在代码中会危及它。

另一种解决方案是不对代码中的秘密信息进行硬编码,而是将其存储在独立文件中并 gitignore 文件。这样做的缺点是,当有人第一次提取您的代码时,秘密信息将会丢失,并且不会开箱即用。这可以通过在代码中编写“如果丢失则初始化”例程来解决,但是您会让 git 系统滑入您的代码,这在 IMO 不是一件好事。

另一个解决方案是制作一个“默认”秘密信息文件,在项目开始时提交它,然后使用您自己的信息而不提交它。但这可能会让 git 抱怨你在拉取时有未提交的更改。

那么常见的处理方法是什么?

【问题讨论】:

Git: Ignore files for public repository, but not for private的可能重复 【参考方案1】:

尝试使用.gitattributes 配置加密/解密过滤器的路径:

*secure.yml filter=crypt

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

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

【讨论】:

【参考方案2】:

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

对于可能遇到问题的用户,您可以签入一个默认文件,他们可以将其复制到他们的主文件夹并进行修改。如果错误消息和自述文件清楚地说明了缺少此特定文件的主题,则此设置将运行良好。

【讨论】:

【参考方案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"/>

第 3 步:将此行添加到 .gitignore 文件中

 **/*/res/values/secrets.xml

这里是完整的article

【讨论】:

【参考方案4】:

最好的解决方案是私有 git submodule 和公共 git 存储库。

更多信息请见this question;给你一个很好的报价:

当您排除或忽略时,您只是在阻止文件被添加到您的存储库中。甚至没有任何“敏感文件”文件在存储库中,只是在您的工作目录中。

【讨论】:

【参考方案5】:

“默认”秘密信息文件是个好主意,但是,即使您忽略该文件,也无法避免 git 警告。来自github help page:

git 不会忽略在规则生效之前已经跟踪的文件 添加到此文件以忽略它。在这种情况下,文件必须是 未跟踪,通常使用git rm --cached filename

因此,添加“虚拟”或“默认”文件然后忽略它不会阻止警告。虽然该方法可行,但会带来不便,因为您总是必须从每次提交中手动排除敏感文件。

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

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

【讨论】:

git update-index --assume-unchanged &lt;file&gt; 可用于忽略跟踪文件中未提交的更改。

以上是关于您如何处理公共 git 存储库中的敏感数据?的主要内容,如果未能解决你的问题,请参考以下文章

您如何处理 Apache Pig 中的空输入文件或丢失的输入文件?

您如何处理 REST API 服务器中的高吞吐量函数?

您如何处理 fetchxml 结果数据?

您如何处理模型类中的外键关系

您如何处理深度链接插件中的简历场景?

机器学习决策树为什么对缺失值不敏感,如何处理缺失值?