Backblaze 16 位校验和(“bzsanity”)

逆向工程 CRC
2021-06-25 07:53:53

我使用 Backblaze 来备份我的电脑。您可以通过选择要还原的文件来从备份中还原文件,然后将这些文件打包成大的 zip 文件。当然,能够在不中断连接的情况下下载 500GB 的 zip 文件是相当罕见的,因此理智的开发人员会实现对 HTTP Range 标头的支持,以允许用户继续下载。

他们没有这样做。相反,他们有一个精品下载实用程序,它通过模拟 POSTed HTML 表单来指定请求的字节范围。此实用程序可以完成您希望普通下载管理器执行的所有操作,例如一次通过多个连接下载并恢复部分完成的下载,但由于一些狡猾的设计问题(例如打开一个成熟的进程,而不是线程,对于每个 40MB 块)它在快速(> 100 Mbps)连接上效率很低。它也是 Windows 独有的。

我正在尝试在 Node.js 中编写一个开源替代品来消除一些糟糕的东西,但我遇到了一个障碍:该实用程序在其 POST 请求中发送的字段之一称为“bzsanity”,是一个 16 -bit 校验和帐户电子邮件地址。不幸的是,我无法弄清楚算法是什么。也许我只是愚蠢,但我希望你们能帮助我。

以下是一些校验和值:

  • 测试@test.com:028a
  • 测试@test.com:4152
  • test2@test.com:3d0f
  • 测试:494c
  • aa:acf2
  • ab:aaad
  • 交流:8e4d
  • 广告:0436
  • ""(空字符串):a93e
  • 一个:ce7f
  • 乙:1a1e
  • c: 1540
  • d:6c57

如果你想要更多的测试向量,我可能可以提供。我尝试在累加器和一些 CRC-16 变体中添加字节,但这些方法不起作用。

2个回答

"test@test.com"为了举例,我将使用它

算法

  1. 将电子邮件地址转换为其 ASCII 字节。例如,ASCII字节"test@test.com"74 65 73 74 40 74 65 73 74 2E 63 6F 6D
  2. 从这些十六进制字节中创建一个小写字符串。使用正在运行的示例,这将产生"7465737440746573742e636f6d".
  3. 计算该字符串的 SHA-1 哈希值。例如,SHA1("7465737440746573742e636f6d") = 90 A2 78 5A 31 39 E2 2A 3D F7 56 90 0A F3 79 87 A9 35 03 16
  4. 从这些十六进制字节中创建一个小写字符串。使用正在运行的示例,这将产生"90a2785a3139e22a3df756900af37987a9350316".
  5. 连接该字符串中的第 2、4、6 和 8 个字符以生成bzsanity值。使用正在运行的示例,这将是'0'+'2'+'8'+'a' = "028a".

只是为了好玩,这里有一个 Python 中的单行代码段来计算bzsanity值:

import hashlib
"".join(map(lambda i: hashlib.sha1("".join(map(hex, map(ord, "test@test.com"))).replace("0x", "")).hexdigest()[i], [1, 3, 5, 7]))

作为 Backblaze 的 CTO 和创始人,我编写了 Backblaze 客户端的原始源代码,上面的 Jason Geffner 是正确的。那是:

  1. 对电子邮件地址进行十六进制编码(全部小写,电子邮件地址不区分大小写)
  2. 取 sha1 - 结果应该是一个 40 字节的人类可读的全小写字符串
  3. 如果 sha1 字符的第一个字符的索引为“零”,则取索引 1、3、5 和 7 处的字符。

——布赖恩