您如何处理公共 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 <file>
可用于忽略跟踪文件中未提交的更改。以上是关于您如何处理公共 git 存储库中的敏感数据?的主要内容,如果未能解决你的问题,请参考以下文章