Category: криминал

Category was added automatically. Read all entries about "криминал".

flow

Merkle tree для идентификации

Криптохэши прекрасно подходят для идентификации статичных данных. Запросили из content-addressable storage (CAS) файлик (точнее blob) по криптохэшу, вот он пришёл, всё можно проверить, ничего нельзя подменить (с поправкой на стойкость криптохэш-функции). Но проверить можно только целиком. А если идентификация не совпала - можно попробовать перекачать, снова целиком, так как неизвестно, какие фрагменты скачаны с ошибками. Для мелких данных ок, для гигабайтных блобов уже нет. Стандартный приём - построить Merkle tree, на нижнем уровне считая криптохэши от фрагментов в N байт, а на каждом следующем криптохэш от списка криптохэшей предыдущего уровня.

Как идентифицировать выбранный алгоритм построения Merkle tree (учитывая разные возможные подходы)? На мой взгляд, удобно задать Merkle tree через криптохэш-функцию и параметр N как максимальный размер и фрагментов данных, и неразрывных фрагментов списков криптохэшей. Например, выбрали SHA-256 и N = 64KiB (2**16) - это фрагменты до 65536 байт данных на нижнем уровне и до 2048 полных криптохэшей SHA-256 на верхних. Тогда получившуюся функцию можно обозначить как SHA-256-P64K (или sha256p64k). При таком подходе идентификация блобов до 64KiB включительно совпадёт с SHA-256, идентификация от 64KiB+1 до 128MiB включительно потребует одного уровня косвенности, и так далее. Обращаемся к CAS, получаем по SHA-256-P64K содержимое файла или карту фрагментов следующего уровня, которые можно параллельно скачивать и проверять, хоть с этого же CAS (с любым приемлемым количеством соединений), хоть с других доверенных источников.

Людей, знакомых с рассматриваемыми технологиями, могла насторожить фраза "идентификация блобов до 64KiB включительно совпадёт с SHA-256". Каждый уровень Merkle tree принято наделять маркером, используемом при вычислении криптохэша на этом уровне. Можно, например, вставить байт 00 перед вычислением криптохэшей от фрагментов данных, байт 01 перед вычислением криптохэшей от фрагментов списков криптохэшей нижнего уровня, и так далее. Без этого идентификация через Merkle tree теряет уникальность, те же байты могут идентифицировать и сами данные, и их "карту", чем могут воспользоваться злоумышленники.

Но я вижу и другое решение. Вместо использования уровня косвенности в качестве префикса при вычислении каждого конкретного криптохэша - использовать это значение в операции xor с последним байтом получаемого криптохэша. В этом случае (для примера с SHA-256-P64K) фрагменты блобов на нижнем уровне будут идентифицироваться по SHA-256, фрагменты списков криптохэшей на следующем - по результату SHA-256 с (hash[31] ^= 1), и так далее с (hash[31] ^= indirection_level). Такая операция возвращает уникальность и обладает тем интересным свойством, что идентификация данных какого-либо уровня и их "карты" расходятся только в последнем байте. Что упрощает отладку и поддержку CAS.

Покрутил я эту модель, прикинул различные сценарии поведения (вплоть до случаев memory error, с учётом прочих метаданных в CAS), и пока выглядит оптимально. Если у вас есть свои соображения - пишите. Чуть позже напишу продолжение об идентификации не-статичных данных.
flow

практики

1) Практики, заведомо противоречащие одна другой, могут быть одинаково полезны. Причём, для одного человека, в конкретный момент времени. Например: одни проповедуют "всегда пить больше воды", другие "сухое голодание денька на три" время от времени. Но обе меняют состояние организма и ведут к мобилизации неких ресурсов, что способно оказать оздоровляющее воздействие. С тем же успехом обе одновременно могут быть вредны. Для другого человека, в другое время. Если состояние OK - не следует его менять, а если чешется - поменяйте в другом месте.

2) Эзотерические практики могут работать или нет. Но те, которые требуют больше осознанности и чувствования, будут работать в плюс, независимо от верности или ошибочности модели (и мировосприятия) за этой практикой. Осознанность и чувствование важны сами по себе, вне зависимости от пути к ним.

3) Даже ошибочные модели могут содержать верные решения. А системы (мировосприятия, религии), распространяемые для манипуляций вами, содержать хорошие и полезные модели, равно как и более чистые системы.

4) Практики, модели, восприятия, всё это создаётся людьми. Не обязательно плохими или хорошими, мошенниками или гениями, такими как есть. Просто они думали над этим больше. И делали больше. Долгие годы. Можно воспользоваться этим в чём-то. Исследовать, осознать, применить. Но не забывать о своём пути.
  • Current Music
    The Dolphin Brothers