Зачем LevelDB и RocksDB нужен `маскированный CRC32` - PullRequest
1 голос
/ 06 мая 2020

Из crc32.h leveldb или rocksdb мы можем найти комментарий, в котором говорится:

static const uint32_t kMaskDelta = 0xa282ead8ul;

// Return a masked representation of crc.
//
// Motivation: it is problematic to compute the CRC of a string that
// contains embedded CRCs.  Therefore we recommend that CRCs stored
// somewhere (e.g., in files) should be masked before being stored.
inline uint32_t Mask(uint32_t crc) {
  // Rotate right by 15 bits and add a constant.
  return ((crc >> 15) | (crc << 17)) + kMaskDelta;
}

Итак, что это означает? Зачем нужна маска?

1 Ответ

1 голос
/ 07 мая 2020

маска

«Маска» объясняется в комментариях и в одной строке кода. Он изменяет 32-битный CR C, вращая его вправо на 15 бит и добавляя константу.

Зачем нам нужна маска?

Маска не " необходимо », но рекомендуется сделать CR C немного сложнее, чем стандартный CR C, при хранении CRC. Я не знаю, почему рекомендуется «защищать» сохраненные CRC таким образом. Если процесс «маскирования» фиксирован и известен, то я не понимаю, как он помогает «защищать» сохраненные CRC. Я предполагаю, что маска является настраиваемой и неизвестна другим пользователям для фактического использования.

проблематично c вычислить CR C строки, содержащей встроенные CRC

Мне непонятно, о чем идет речь. Нетрудно сгенерировать данные, которые могут go в любом месте строки, чтобы вычисленный CR C был действительным. Обычно к сообщению добавляется CR C, но его можно перебрать назад на n бит, умножив CR C на (1 / (2 ^ (n))) (в собственном поле Галуа), без переноса умножение, которое может быть ускорено с помощью такой инструкции, как x86 pclmulqdq (он использует регистры xmm). Например, скажем, 32-битный CR C должен храниться в битовом индексе j строки с m битами, включая как данные, так и CR C. 32 бита с индексом j обнуляются, затем стандартный CR C используется для вычисления CR C, как если бы он был добавлен в битовый индекс m . Затем CR C циклически повторяется в обратном порядке m - j бит и сохраняется в битовом индексе j .

Имея несколько CRC, встроенных в string затруднит обратный инжиниринг, но я видел случаи, когда в файлах сохранения, используемых для игр, было два встроенных CRC, и хакеры могли реконструировать метод двойного CR C.

...