零知识代码托管?[关闭]


28

鉴于最近有关政府对在线服务提供商存储的数据进行广泛监视的启示,零知识服务现在非常流行。

零知识服务是其中所有数据都以未存储在服务器上的密钥加密存储的服务。加密和解密完全在客户端进行,并且服务器永远不会看到纯文本数据或密钥。结果,服务提供商无法解密,也无法将数据提供给第三方。

举个例子:SpiderOak可以被视为Dropbox的零知识版本。

作为程序员,我们高度依赖于我们最敏感的数据(我们的代码),并将它们信任特定种类的在线服务提供商:代码托管提供商(如Bitbucket,Assembla等)。我当然在这里谈论私有存储库-零知识的概念对于公共存储库没有意义。

我的问题是:

  1. 创建零知识代码托管服务是否存在任何技术障碍?例如,关于流行的版本控制系统(例如SVN,Mercurial或Git)使用的网络协议是否存在某些问题,这将使(或不可能)实现一种方案,其中使用服务器不知道的密钥?

  2. 当今是否存在零知识代码托管服务?


1
没有同态加密,我看不到零知识代码托管站点如何比保管箱的零知识版本提供任何好处。我不相信任何人都可以提出这样一个既安全(即足够安全,以至于专家信任的方案)又足够快以致可用的方案。
布莱恩

2
@AndresF。我只能假设SpiderOak意味着在客户端上生成差异,服务器存储加密的差异,然后在对diff和base进行加密时,在客户端上再次出现基于差异的应用程序。我同意他们的语言非常不清楚。
13年

2
@apsillers:或者您可以故意将此类内容填充到文件中,并使用它来标识文件本身(例如,如果有人试图使用加密来隐藏盗版)。
布赖恩

4
我没有任何经验,但是我可以想象拥有零知识代码托管服务的一个可能的技术障碍:不是所有用户都需要知道/使用完全相同的密钥吗?如果是这样的话,将如何确保不同级别的用户访问的身份验证机制?
CB

2
@gnat:我不是要建议。我只是问问我描述的那种服务是否存在。这种服务的存在将提供证据证明我在问题中较早提出的技术障碍是可以克服的。
HC4-恢复莫妮卡

Answers:


3

您可以单独加密每行。如果您有能力泄漏文件名,近似的行长以及发生行更改的行号,则可以使用以下方法:

https://github.com/ysangkok/line-encryptor

由于每行都是单独加密的(但使用相同的密钥),因此上载的更改(通常)将仅涉及相关行。

如果目前还不够方便,则可以创建两个Git存储库,一个使用明文,另一个使用密文。当您在纯文本存储库(本地)中提交时,提交钩子可以获取diff并通过上面引用的行加密器对其进行运行,这会将其应用于密文存储库。密文存储库更改将被提交并上载。

上面的行加密器与SCM无关,但是可以读取统一的diff文件(纯文本格式)并加密更改并将其应用于密文。这使得它可以在任何会生成统一差异(例如Git)的SCM上使用。


您不能为此使用git的污迹清理吗?
2013年

@svick:您可以,但是那样,我看不到如何避免重新加密整个文件。但是当然,由于文件很小,因此对于代码来说并没有太大关系。但是,不需要“行加密器”,则可以使用任何加密工具。
Janus Troelsen

大量文本样本(结构已知)会不会更容易攻击密钥?每个空白行都将加密相同的内容。每个Javadoc的开始和结束都是相同的。现在您知道了可以使用的代码段的明文和密文。这可能对除了业余爱好者以外的任何人都没有用(任何具有受过训练的加密类型或足够的计算能力的人都可以通过足够的努力来破坏它)。

@MichaelT:不,因为静脉注射。自己尝试一下:)使用链接的实现,将行加密为<IV>,<ciphertext>
Janus Troelsen

1
@svick:行被单独加密。如果更改一行,整个行将被重新加密,但是将使用新的IV(一如既往)。但是文件的其余部分将不会被触碰!加密是确定性的,但IV也是输入,它们是伪随机选择的。
Janus Troelsen

1

我认为没有任何障碍-考虑SVN,发送到服务器进行存储的是代码的先前版本与当前版本之间的增量-因此,您更改1行,仅将该行发送到服务器即可。然后,服务器“盲目”存储它,而无需对数据本身进行任何检查。如果您加密增量并将其发送,则不会对服务器造成任何影响,实际上,您甚至根本不需要修改服务器。

还有其他可能很重要的位,例如不容易加密的元数据属性(例如mime类型),但是其他位也可以被加密,例如历史记录中的注释,只要您知道必须在加密时解密它们即可。客户查看。我不确定目录结构是否可见,由于SVN存储目录的方式,我认为它不可见,但是可能我错了。如果内容安全,这对您可能并不重要。

这意味着您将无法拥有一个具有各种代码查看功能的网站,没有服务器端存储库浏览器或日志查看器。没有代码差异,没有在线代码审查工具。

某种程度上说,Mozy已经存储了用私钥加密的数据(您可以使用自己的私钥,并且它们会发出“如果您丢失自己的密钥,太糟糕了,我们将无法恢复您的数据用于您”,但这更针对普通用户)。Mozy还存储文件的历史记录,因此您可以检索以前的版本。失败的地方是定期上传,而不是在需要时检入,我相信当存储空间用完时,它会丢弃旧版本。但是概念在那里,他们可以使用现有系统对其进行修改以提供安全的源代码控制。


回复:“这意味着您将无法拥有一个具有各种代码查看功能的网站,没有服务器端存储库浏览器或日志查看器。没有代码差异,也没有在线代码审查工具。” -如果应用程序逻辑位于客户端JS中并且使您输入密码/密钥(但未将其发送到服务器),您仍然可以拥有这些密码,对吗?
HC4-恢复莫妮卡

是的,它可以...。只要知道它正在通过网络接收加密数据,任何事情都可以。服务器无法解密数据只是一个明显的限制。
gbjbaanb

1

我讨厌做其中一种“这不会完全回答您的问题”的答案..但是..

我可以想到两个可以解决这些问题的现成解决方案。

  1. 自己托管一个私人Git服务器。然后将该服务器放在您可以授予团队成员访问权限的VPN上。与服务器之间的所有通信都将被加密,您当然可以在操作系统级别对服务器进行加密。

  2. BitSync应该也可以解决问题。一切都将被加密,并在庞大的网络中随处可用。实际上,所有这些BitCoin / BitMessage / BitSync技术都可能是一个非常好的应用。

最后,https: //security.stackexchange.com/上的人们可能会有更多的见解。


关于BitSync:您是否建议将其用作版本控制系统的替代品,或以某种方式与版本控制系统一起使用?如果是前者,那么可以肯定,但这不是很有趣。我也可以在SpiderOak上共享文件,它可以是集中式的,但仍然为零知识。如果是后者,那又如何?
HC4-恢复莫妮卡

1
@ HighCommander4尚未尝试过,但不应由于任何原因而使其无法正常工作。无法设置同步以共享已初始化的git文件夹,然后正常进行即可'git push ./syncedFolderActingAsServer/MyAwesomeProject/src/'吗?您还可以执行git级权限等。有人应该尝试此操作!
橡皮鸭

1

据我了解,git pull工作方式是服务器向您发送一个打包文件,其中包含所需的所有对象,但当前没有。反之亦然git push

我认为您不能直接这样做(因为这意味着服务器必须了解对象)。相反,您可以做的是让服务器仅处理一系列加密的打包文件。

为此pull,您下载自上次添加的所有pack文件pull,解密它们并将其应用于git repo。要做push,您首先必须做pull,以便您知道服务器的状态。如果没有冲突,则使用更改创建一个打包文件,对其进行加密并上载。

使用这种方法,您最终将获得大量的小包装文件,这将是非常低效的。要解决此问题,您可以下载一系列打包文件,解密,将它们组合成一个打包文件,加密并将它们上传到服务器,并将它们标记为该系列的替代文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.