情况
你好,我想用 git 保存加密数据(在某些平台上,例如比特桶或者github)因此问题是:
问题
我正在寻找不同的无忧方式:
如何设置bitbucket 上的加密存储库(/github)?现在,我是 git 新手,因此需要所有必要步骤或者一步一步来将不胜感激!
“研究”
git-crypt
我发现git-crypt,但网站上提到它适用于单个文件加密。如果想要加密整个存储库,则需要转发到git-remote-gcrypt。
git-remote-gcrypt
在他们的自述文件他们把它说得很简单
快速开始
git remote add cryptremote gcrypt::rsync://example.com:repo
git push cryptremote master
> gcrypt: Setting up new repository
> gcrypt: Remote ID is :id:7VigUnLVYVtZx8oir34R
> [ more lines .. ]
> To gcrypt::[...]
> * [new branch] master -> master
或以下
例子
# notice that the target git repo must already exist and its
# `next` branch will be overwritten!
git remote add gitcrypt gcrypt::[email protected]:repo#next
git push gitcrypt master
特里斯
我更喜欢完整的存储库加密,因此我尝试了git-remote-gcrypt
各种变体快速开始和例子到目前为止,我尝试按照他们的说明推送现有存储库。结果如下:(注意:我特意将用户名更改为user
)
-> 与ssh
所提供的示例一样
[...]/git_test$ git remote add origin gcrypt::[email protected]:user/test.git
[...]/git_test$ git push -u origin --allgcrypt: Development version -- Repository format MAY CHANGE
gcrypt: Repository not found: [email protected]:user/test.git
gcrypt: Setting up new repository
gcrypt: Remote ID is :id: ...
Zähle Objekte: 10, Fertig.
Komprimiere Objekte: 100% (6/6), Fertig.
Total 10 (delta 0), reused 0 (delta 0)
gcrypt: Encrypting to: --throw-keyids --default-recipient-self
gcrypt: Requesting manifest signature
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
error: Fehler beim Versenden einiger Referenzen nach 'gcrypt::[email protected]:user/test.git'
或与https
(有效)
[...]/git_test$ git remote add gitcrypt gcrypt::https://[email protected]/user/test.git
[...]/git_test$ git push -u gitcrypt --allgcrypt: Development version -- Repository format MAY CHANGE
Password for 'https://[email protected]':
gcrypt: Repository not found: https://[email protected]/user/test.git
gcrypt: Setting up new repository
Password for 'https://[email protected]':
gcrypt: Remote ID is :id: ...
Zähle Objekte: 10, Fertig.
Komprimiere Objekte: 100% (6/6), Fertig.
Total 10 (delta 0), reused 0 (delta 0)
gcrypt: Encrypting to: --throw-keyids --default-recipient-self
gcrypt: Requesting manifest signature
Password for 'https://[email protected]':
To gcrypt::https://[email protected]/user/test.git
* [new branch] master -> master
Branch master konfiguriert zum Folgen von Remote-Branch master von gitcrypt.
尽管如此,我不明白如何添加用户或甚至只是拉我的备份到另一台机器上 (因为我的 gpg 密钥是在本地生成的)!? 欢迎随意回答有关用法的问题git-remote-gcrypt
。
答案1
一个免费且部分开源的工具是 密钥库:
Git 支持远程助手。我们已经开发了一个开源助手。
Keybase 的远程助手在让 git 完成其工作的同时执行所有加密。这听起来可能令人印象深刻,但 Keybase 并没有从头开始重新实现 git。我们提供了一个远程助手,由优秀的 go-git 项目提供支持,我们已经开始为该项目做出贡献。
我们提出:(1)加密,(2)团队 + 多设备密钥管理,(3)更安全的身份概念。
它是端到端加密的。它像 GitHub 一样托管,但只有您(和队友)可以解密其中的任何内容。对于 Keybase 来说,一切都只是一团乱麻。对于您来说,这只是一次常规结账,无需额外步骤。
甚至您的存储库名称和分支名称都经过加密,因此 Keybase 员工或渗透者无法读取。
通过以下方式支持团队合作 Keybase 团队:
Keybase 团队是一群有名称的人员,成员资格灵活。假设您在一个名为 Treehouse 的项目上工作。您可以在 Keybase 上注册 treehouse。此团队名称是通用的;只能有一个具有给定名称的 Keybase 团队。
团队可以进行聊天和频道。聊天看起来有点像 Slack 或 Discord:
但是 Keybase 团队合作是端到端加密的,这意味着您不必担心服务器被黑客入侵。
答案2
使用 git-remote-gcrypt 和 Bitbucket 的分步说明:
先决条件
- GnuPG(
brew install gpg
在 macOS 上) - git-remote-gcrypt(
brew install git-remote-gcrypt
在 macOS 上)
概述
本指南将引导您完成使用 Bitbucket 创建和使用名为“gcrypt-sample”的 git repo 的过程,利用 git-remote-crypt 和专用的 PGP 密钥对提供端到端加密。
每次推送都将是强制推送!
脚步
配置
- 设置本地和远程存储库:
- 使用以下方式设置本地存储库
git init gcrypt-sample
- 在 bitbucket.org 上创建一个存储库
gcrpyt-sample
- 使用以下方式设置本地存储库
- 如果尚未设置 ssh 密钥,请先设置:
ssh-keygen
- 添加 gcrypt 远程:
git remote add cryptremote gcrypt::[email protected]:user/gcrypt-sample.git
- 生成你的 GPG 密钥对。推荐本指南;对于此示例,只需运行
gpg --gen-key
即可。 - 配置 gcrypt 以接受您刚刚创建的 gpg 密钥:
git config remote.cryptremote.gcrypt-participants <GPG key fingerprint>
git config remote.cryptremote.gcrypt-signingkey <GPG key fingerprint>
- 编辑你的 git 仓库:
echo 'Hello, world!' > hello.txt
git add hello.txt
git commit
git push -u cryptremote master
- 如果您有多个 PGP 密钥对,则必须循环进行直到获得所需的密钥对 - 这是因为您每次都会先拉后推;请参阅下面的注释。
关于从 repo 中提取的说明
每次拉取(包括推送)时,您都必须循环检查 PGP 密钥,直到找到正确的密钥。原因是 git-remote-gcrypt 默认使用隐私保护,该保护会删除签名密钥的身份。因此,从存储库拉取时,您必须检查所有可用密钥以查看哪个是签名密钥。可以通过设置属性(remote.cryptremote.gcrypt-publish-participants
任何值)来发布使用的签名密钥(从而撤销匿名性)。
如果您为存储库设置了明确且单一的 PGP 密钥,那么这样做应该没问题。但是,这样做确实会对共享存储库产生影响(不同的提交可以不可否认地与不同的用户绑定)。
加密了什么?
就我的肉眼而言,几乎所有东西。
什么是加密
- 文件名(包括路径)
- 文件内容
- 分支机构(我不知道第一的推送的分支记录在 master 下,但所有后续分支都记录在 master 下)
- 提交历史:只有一个提交(“初始提交”)和一个日期(当然,您的推送日期可能会由您的远程单独跟踪 - BitBucket 的“上次更新”显示了准确的时间。当然,Bitbucket 可能不会关注提交本身 - 它可能假设您正在这样做。)
未加密的内容
- 存储库名称(虽然这很明显);只需使用代号即可
- 文件的数量或大小(它们不以任何方式分发);不确定对不同分支有何影响
答案3
我最近在 的帮助下通过 GitHub 上的加密存储库同步两台不同的机器时遇到了问题git-remote-gcrypt
。所以我希望以下内容能回答如何添加用户或者甚至只是拉我的备份。
其他来源
以下是我使用的资料来源:
- https://manpages.debian.org/testing/git-remote-gcrypt/git-remote-gcrypt.1.en.html似乎是官方手册页。
- https://caolan.uk/notes/2017-04-27_encrypted_git_repositories.cm
- https://git-annex.branchable.com/tips/fully_encrypted_git_repositories_with_gcrypt/
- https://www.alwaysrightinstitute.com/gcrypt/
- 这些可能也有助于与其他工具进行比较:http://ptspts.blogspot.com/2017/10/comparison-of-encrypted-git-remote.html
先决条件
我假设您已经在两台计算机上设置了单独的 gpg 密钥(key1
在机器 1 上,key2
在机器 2 上)。此外,您还应该在 Bitbucket、GitLab 或 GitHub 上创建一个私有存储库。我假设这里是一个 GitHub 存储库。
安装
您应该能够git-remote-gcrypt
通过以下方式轻松安装
sudo apt install git-remote-gcrypt
或您发行版中的等效语句。否则,上述来源有更多有关安装的信息。
两台机器上的全局配置
与 gpg-agent 兼容
为了使用gpg-agent
解密存储库,请在两台机器上运行以下命令
git config --global --add gcrypt.gpg-args "--use-agent"
可选:发布参与者
参见此说明:https://manpages.debian.org/testing/git-remote-gcrypt/git-remote-gcrypt.1.en.html#gcrypt.publish 要使用在两台机器上运行的选项
git config --global --add gcrypt.publish-participants true
交换 gpg 密钥
另请参见此处:https://www.gnupg.org/gph/en/manual/x56.html
- 在机器 1 上运行:
gpg --output key1.pgp --armor --export key1
- 在机器 2 上:
gpg --output key2.pgp --armor --export key2
- 将文件复制
key1.gpg
到机器 2 并且反之亦然key2.gpg
。 - 然后在机器1上运行:
gpg --import key2.gpg
- 在机器 2 上:
gpg --import key1.gpg
- 导入密钥后,您必须按照上面链接的说明进行验证。
当然你也可以只使用一个密钥。然后你需要将密钥从一台机器复制到另一台机器。
设置
机器 1 的初始推动
cd
进入要同步或备份的文件夹git init
- 跑步
git remote add origin gcrypt::[email protected]:<USER>/<MY_REPO>.git
- 添加用于加密存储库的密钥:
git config remote.origin.gcrypt-participants "key1 key2"
- 如果这
key1
不是机器 1 上的默认签名密钥,请使用 添加它作为此存储库的签名密钥git config remote.origin.gcrypt-signingkey "key1"
。 - 添加一切
git add .
- 并提交:
git commit -m "Initial commit"
- 选修的:
git branch -M main
- 并推送存储库:
git push -u origin main
在机器 2 上克隆
git clone gcrypt::[email protected]:<USER>/<MY_REPO>.git
- 如果系统提示您输入 gpg 密钥的密码,请取消,直到您看到您输入的是正确密钥的密码。
- 忽略
warning: You appear to have cloned an empty repository.
- 然后
cd
进入新创建的文件夹。 git pull origin main
- 并切换到正确的分支:
git checkout main
- 在本机添加参与者列表:
git config remote.origin.gcrypt-participants "key1 key2"
。 - 如果这
key2
不是机器 2 上的默认签名密钥,请使用 将其添加为机器 2 上存储库的签名密钥git config remote.origin.gcrypt-signingkey "key2"
。
测试两台机器之间的同步
- 在机器 2 上添加并提交更改。
git push
- 在第一台机器上运行
git pull
。查看新添加的内容。 - 在机器 1 上执行相同的三个步骤,然后在机器 2 上拉动。
故障排除
gcrypt:解密清单失败!
确保用于签署清单文件的密钥位于 中列出的密钥中remote.origin.gcrypt-participants
。使用配置变量user.signingkey
或remote.origin.gcrypt-signingkey
指定用于签署的密钥。
如果您想使用单独的密钥(key3
)来签署来自列表中的密钥remote.origin.gcrypt-participants
(key1
和key2
)的 git 提交,您需要使用以下配置:
git config user.signingkey "key3"
git config remote.origin.gcrypt-participants "key1 key2"
git config remote.origin.gcrypt-signingkey "key*" # Use the correct key depending on your machine!
因此,git 配置变量与 git 和 gcrypt 结合具有以下功能
- 为了签署你的提交,git 使用
user.signkey
- 为了签署清单文件,gcrypt 使用
remote.origin.gcrypt-signingkey
。如果未设置,gcrypt 将返回user.signingkey
。无论使用哪个密钥签署清单,此密钥都需要成为列表的一部分remote.origin.gcrypt-participants
。 - gcrypt 加密你的存储库,以便可以使用 中列出的密钥进行解密
remote.origin.gcrypt-participants
。
连接被对方重置git repack
正如手册页中提到的那样,git-remote-gcrypt
有时会重新打包存储库(https://manpages.debian.org/testing/git-remote-gcrypt/git-remote-gcrypt.1.en.html#KNOWN_ISSUES)。在我的情况下,这会导致Connection reset by peer
ssh 出现错误。目前,我有以下几种方法可以解决这个问题:
- 删除您的 GitHub 存储库并重新创建。然后重新启动从本地存储库到新创建的远程存储库的连接。
- 由于这是一个非常糟糕的解决方案,我还尝试添加 https 远程:
使用 https 远程
我为 GitHub 创建了一个(经典的)个人访问令牌,并在两台机器上为 https 添加了单独的 git remote:
git remote add https gcrypt::https://<USER>@github.com/<USER>/<MY_REPO>.git
# very important to not destroy your repo!!!!
git config remote.https.gcrypt-participants "key1 key2"
git push https # you get several prompts for your https password/token
# pull with the following command
git pull https
我强制用这个 https 远程重新打包,Connection reset by peer
错误没有发生。但是,我不知道当重新打包由 gcrypt 本身发起时会发生什么。
重新启动 gpg-agent
gpgconf --kill gpg-agent
在许多情况下,重新启动 gpg-agent或重新启动终端确实有意义。这将解决not found
此处提到的问题:https://manpages.debian.org/testing/git-remote-gcrypt/git-remote-gcrypt.1.en.html#KNOWN_ISSUES
答案4
这可以通过使用积极开发的用户空间加密文件系统工具如加密文件系统或者密码器. 文件路径也被加密。
gocryptfs 使用
我个人更喜欢 gocryptfs 而不是 cryptomator,因为前者是一个二进制文件,而且更容易实现自动化。尽管 cryptomator 看起来是一个更成熟的项目。
通用电气公司是一个 bash 实用程序,它试图使在 git repo 中使用加密的 gocryptfs 文件系统更加方便。至少,请注意-sharedstorage
它与 gocryptfs 一起使用的选项。
Cryptomator 使用
- 创建一个加密的保管库。可选择从此目录中
~/cryptomator/encrypted/myvault1
删除无用的文件。IMPORTANT.rtf
git init
在包含加密保管库的上述目录中运行。添加一个或多个 git 远程 URL。- 将保管库解密为
~/cryptomator/decrypted/myvault1
。在解锁的保管库中添加或更改一个或多个文件。 - 提交并推送 git repo 中的所有更改。