当您将代码保存在公共git仓库中时,如何处理秘密API密钥,哈希盐等敏感数据?
显然,将敏感数据保留在代码中会对其造成损害。
另一个解决方案是不对代码中的秘密信息进行硬编码,而是将其存储在独立文件中并对文件进行gitignore。这样做的缺点是,当有人第一次提取您的代码时,秘密信息将会丢失,并且不会开箱即用。这可以通过在代码中编写“初始化,如果缺少”例程来解释,但是然后你让git系统进入你的代码,这对IMO来说不是一件好事。
另一个解决方案是创建一个“默认”秘密信息文件,在项目开始时提交它,然后使用您自己的信息而不提交它。但这可能会让git抱怨你在拉动时有未经提交的更改。
那么处理这个问题的常用方法是什么?
答案 0 :(得分:9)
尝试将.gitattributes用于配置加密/解密过滤器的路径:
*secure.yml filter=crypt
在.git / config中添加crypt过滤器的配置:
[filter "crypt"]
clean = openssl enc ...
smudge = openssl enc -d ...
required
答案 1 :(得分:3)
可以说,您不应该将这些属性硬编码到源中,因为管理员希望该选项在给定系统上更改它们。如果这些属性位于属性文件中(例如,在您的主目录中),问题就解决了。
对于可能遇到问题的用户,您可以签入他们可以复制到其主文件夹并进行修改的默认文件。如果错误消息和自述文件清楚地显示缺少此特定文件的主题,则此设置将非常有效。
答案 2 :(得分:2)
最佳解决方案是私有git submodule
和公共git存储库。
有关详细信息,请参阅this quesiton;给你一个很好的报价:
当您排除或忽略时,您只是将文件保留在存储库中。没有任何“敏感文件”文件甚至存储在存储库中,只是在您的工作目录中。
答案 3 :(得分:2)
如果有人需要他们的Android项目,我找到最简单的方法:
第1步: create:res / values / secrets.xml with:
<!-- 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 :(得分:0)
“默认”秘密信息文件是一个好主意,但是,即使您忽略该文件,也无法避免git警告。来自github help page:
git不会忽略规则之前已经跟踪过的文件 添加到此文件以忽略它。在这种情况下,文件必须是 未跟踪,通常使用
git rm --cached filename
因此,添加“虚拟”或“默认”文件然后忽略它不会阻止警告。虽然该方法可行,但由于您始终必须从每次提交中手动排除敏感文件,因此会很不方便。
取消跟踪文件会将其从github中删除,这样就无法将文件放在首位。
也许子模块建议可行。