RESTRIC CREDPTOCTION(2017)

2021-06-13 04:31:04

TL;博士:这不是审计,我对你的备份不承担任何责任,但我快速看看了加密,我认为我会为我的个人备份使用RESTIC。

我一直听到关于RESTIC的好事。我正在重做我的存储解决方案,RESTIC似乎勾选了我个人备份的所有框:

今天我必须等待几个小时才能获得护照(I'米意大利语,这涉及魅力的掷骰子)所以我想看看它。

重要提示:这没有资格作为专业审计,我也没有认可'在&#34之外的加密;我在一个嘈杂的候诊室里看了一小时,我猜和#34;

这篇文章也不试图完全解释它提到的所有密码,所以如果你发现一些特别好奇,令人困惑或迷人的人让我知道和我试图正确写作。

RESERIC备份到存储库。存储库存储在给定的遥控器处。 '在存储库中重复数据删除。

存储库内容是由SHA-256在加密文件级别寻址的内容,而不是备份文件级别。那个'很好不要泄漏窝藏,但我想知道重复数据删除是如何工作的。

其他一切都是在这些文件内完成的抽象。这非常让人想起Camlistore。我想知道是否有缓存/索引,或者它知道如何从头开始走树。 (结果,两者!见下文。)

基本上:对对副主话存储库的存储文件和元数据的机密性和认证。回滚和快照相关性是可能的。退房。

每个repo-256-ctr-poly1305-AES加密每个仓库文件(其中SHA-256的那些)。格式为" 16字节随机IV +密文+ Mac&#34 ;:加密-T'-Mac,良好。

不寻常的选择,不使用AES-GCM。明确:GCM是可怕的,但对于TLS的原因,它的理由是最快的实现的艾德。在点的情况下,Go Aes-Ctr的情况慢得多,没有充分的理由。同样不寻常的不是使用TLS配对Chacha20-Poly1305。选择AES可以使用硬件加速度,但在练习中,Chacha20-Poly1305可能比AES-CTR更快。总而言之,它'在理论上是理性的选择,但在实践中具有不寻常的和误的次优。虽然仍然安全,A"自轧" Aead有点黄旗(但不是红色的标志)。

我承认我以前的' t之前学习过poly1305-aes,但它' s的Poly1305的原始设计。我知道的Poly1305身份验证器并通过Go实现使用一次性键; Poly1305-AES使用固定键AES操作来加密NONCE以进行一次性键。 Poly1305键是32个字节,用于两半作为r(在Poly1305-AES中固定并被屏蔽)和S(这是与Poly1305-AES中的AES衍生的唯一部分)。检查该Poly1305-AES实现是否保持右半修复,因为Golang.org/crypto/poly1305只需要一个未记录的* [32]字节"一次性键"而且我怀疑切换得出,固定半可能是灾难性的。 Go Package不会记录其中一半是哪个。

有安全的方法可以重用k进行加密,但本文未分析这些方式。

密码到键派生是经典的双重包装:Plaintext密钥元数据文件(包括主机名/用户名)包含Scrypt参数,salt和数据斑点。 Scrypt使用提供的密码用作KDF以生成要解密的密钥(AES256-Poly1305-AES)包含主键的BLOB。攻击者可以防止密码撤销,因此在损害之后更改密码并将将来备份保护到该存储库。通过为随后生成的BLOB进行新的主密钥来提高这一点。

我想知道它是否有可能,操纵n / r / p / salt,使未知密码生成可预测的键。如果是,攻击者可以强制客户端用他们控件的键进行备份。它可能是' t,但我没有时间弄清楚它归结为哪个斯克拉斯属性。 (为读者锻炼!)

数据和树Blobs是单独加密的,并在具有加密标题的包文件中装配在一起。所有明文Blobs的完整索引保存在客户端,并在存储库中加密。

每个文件的数据被分成在由64字节的滑动窗口定义的偏移中剪切的可变长度BLOB。该实现使用Rabin指纹来实现此内容定义的块(CDC)。当初始化存储库时,随机选择不可缩短的多项式并在文件配置中保存,因此水印攻击更加困难。

不是句子&#34的粉丝;攻击更难"我对Rabin指纹很少了解,但我可以想象攻击依赖散块算法通过Blob尺寸依赖泄漏。并包装不' t帮助,因为我打赌你可以发现它们的Poly1305身份验证器,允许您在不读取标题的情况下拆分Blobs。

我' ll加入Todo来了解有关CDC的更多信息。 (在RESTIC BLOG上有关于它们的帖子!)与此同时,I' ll相信这种不可缩短的多项式,使泄漏不太明显,并记住以可靠的方式备份可能的攻击者提供的数据。

这也是因为攻击者提供的数据可能导致任何类型的重复数据删除系统都能直接指纹攻击攻击。 (这应该是威胁模型。)

有明确的钥匙/加密键/麦克基结构,具有单独的k和r对于Poly1305-AES,这是良好的。用随机数据填充它们的间接量使我不舒服 - 一个丢失的*并且通过逐个值会导致空键 - 但它似乎是正确的。另外,嘿,那个(* key).valid()正在检查,整洁!

Poly1305-AES实现似乎将R和AES(k)放在正确的顺序中,用于Golang.org/crypto/poly1305(见上文),在键的前16个字节中用r。

但是,应用程序代码坚持屏蔽R,因为纸张在调用Poly1305之前说,即使该包不需要它。这让我担心,因为Poly1305所做的掩模看起来不同。如果Poly1305决定使用不同的表示(因为它可以,因为关键零件和格式未指定),现在RESTIC正在掩盖有意义的比特? 😱

现在我' m读取130位算术映射到26位整数的注册表,以弄清楚DJB' S魔法面具实际上是对数字(deja-vu ... coughclamping咳嗽)。当你滚动自己的加密时,这就是发生的事情。你让加密人员受伤。想想你的密码师。

事实证明它和#39;在26位小型窗口中相同的掩蔽。这里'我必须弄清楚的ASCII艺术素描。 (在逆转位移和交换方向时,它比较下面的纸张面具和Poly1305的纸张面具。

无论如何,应用面膜是毫无意义的,危险的,持续45分钟到审计。我将在恢复时提交PR以将其删除。

我在查看它时简化了其余的加密/解密。解密API(与加密1)不返回新切片,但只有一个int为调用者才能将明文切片。感觉像忘记一件容易和坏的事情,所以我用SourceGraph检查了呼叫者。发现没有问题。

(FWIW,i' m a append()的粉丝 - 如界面,您可以在其中通过切片来重用缓冲区,但忘记重新分配结果切片。)

然而,似乎是解密重叠规则的问题。要保存内存,您可能希望为明文和密文使用相同的缓冲区。允许某些约束。由CTR模式实现的密码接口在方法XORKEYSTREAM中表示此操作:

那是一个助人的' t很有帮助。在一个问题上已经有关于它的讨论,但我认为这意味着DST和SRC可能完全重叠(没有错位)或根本不重叠。

但是,使用相同的缓冲区进行解密,用于明文和密文(如在整个代码中所做的那样)意味着由于IV,Buf [16:]被解密到Buf [:]。理论上(?)不是好的。

我对此开辟了一个问题,但我不认为它'现在是一个问题(但它可能成为CTR实现优化的问题)。我建议采用标准的密码界面.AED界面,这是附加风格的,使其变得容易变得精确重叠。

我终于快速了解内部/存储库/ key.go。我确保scrypt是唯一的KDF,并澄清了关键对象中的数据字段只是与任何其他百波一样加密。设计文档的MAC大小错了,让我感到困惑。

设计可能并不完美,但它'很好。加密是一个一流的功能,实现看起来很明智,我猜重复数据删除权衡是值得的。

同样,这不是对密码系统的专业评估,也不是对实施的审计。感谢Alexander Neumann写作RESTIC并为此帖子提供有用的反馈。

我快速了解AES256-Poly1305-AES加密方案和&#34代码; RESTIC" 在使用它之前为我的备份。 https://t.co/pewe7wdlpz. - 2017年8月29日Filippo Valsorda(@Filosottile)