Hash, chunkhash и contenthash

Алан-э-Дейл       13.05.2023 г.

Как работает хеш-функция SHA-256

Она известна тем, что используется в блокчейне биткоина. SHA означает «безопасный алгоритм хеширования»‎, а число 256 — объем кэша в битах.

Работа хеш-функции SHA-256 напоминает создание отпечатков пальцев. Чтобы идентифицировать человека, не надо знать всю информацию о нем. Достаточно знать отпечаток его пальца. SHA-256 вычисляет такой «отпечаток» у текстов, видео, картинок, музыки и любого вида информации. 

Если не углубляться в технические детали, алгоритм работы можно описать следующим образом:

  1. На вход поступает сообщение — файл размером до 2 млн терабайт.
  2. Выполняются математические преобразования.
  3. На выходе получается хеш — 64-значное число.

Попробовать закодировать текст и посмотреть как работает хеш-функция можно онлайн. Для примера закодируем два сообщения: «Maff.io» и «maff.io». SHA-256 популярна, в том числе потому, что кодирует сообщения моментально.

Два сообщения «Maff.io» и «maff.io» после кодирования SHA-256 сильно отличаются своим хешем.

Первое, что бросается в глаза, то как сильно отличаются хеши. Даже небольшое изменение в сообщении меняет хеш настолько сильно, что невозможно заметить сходства между новым и старым значением. Хеш-функция SHA-256 гарантирует, что невозможно изменить сообщение, не меняя хеша. 

Второе, на что следует обратить внимание — набор из букв и цифр в хеше. На самом деле это одно 64-значное число, просто записанное в шестнадцатеричной системе счисления

Чтобы найти два разных сообщения с одинаковым хешем, придется перебирать их миллионы лет.

Таким образом, если два сообщения имеют одинаковый хеш, то можно быть уверенным, что они одинаковые. Вот почему алгоритмы с хеш-функциями считаются таким надежным.

От чего зависит хешрейт?

Хешрейт майнинг установки зависит от вычислительного потенциала комплектующих. Также на его уровень влияют:

  • Настройки программы для майнинга;
  • Правильность ;
  • Стабильность подключения к серверу и электросети.

На разных алгоритмах вычислений hashrate конкретной майнинг машины может существенно отличаться. Причиной тому являются конструктивные особенности девайсов от разных производителей.

Статистика и оборудование

При покупке железа для майнинг-фермы в первую очередь нужно ориентироваться на показатели хешрейта.

Определить вычислительный потенциал видеокарты или АСИКа помогают специализированные сервисы такие, как . На данном сайте собраны данные о большинстве используемых для криптодобычи электронных гаджетов.

Хешрейт в облаке

В облачном майнинге дела обстоят несколько иначе. Пользователь окупает определенное количество хешрейта вырабатываемого оборудованием дата-центра и получает дивиденды в криптовалюте. Клиент выбирает только сервис, с которым он хочет работать и нужную монету.

Что такое хэш биткоина?

Для начала важно иметь общее представление о том, что такое хэш-функция и что она делает

Что такое хэш?

Алгоритм хэширования берет данные любого произвольного объема (числа, алфавиты, медиафайлы) и преобразует его в фиксированную буквенно-цифровую строку. Размер фиксированного бита может варьироваться (например, 64-битный или 128-битный или 256-битный) в зависимости от используемой хэш-функции.

И этот выход фиксированного размера — это то, что называется хэшем. Другими словами, хэш является криптографическим побочным продуктом хэш-алгоритма.

Хэш-алгоритм обладает определенными уникальными свойствами:

  • Он генерирует уникальный результат (хэш).
  • Это односторонняя функция.

Математика, лежащая в основе алгоритма хэширования, гарантирует, что нет способа генерировать исходные данные из созданного хэша. Это означает, что хэш функционирует только в линейной прогрессии. Если прибегнуть к аналогии, то вы не сможете создать реальный человеческий палец, имея лишь отпечаток.

Вот почему хэш можно рассматривать как «цифровой отпечаток» данных, обрабатываемых хэш-функцией. Следуя логике, один и тот же хэш будет генерироваться только из одних и тех же входных данных. Однако, если вы даже незначительного измените входные (пробел или запятая), то на выходе хэш полностью изменится.

Блокчейн биткоина в свои механизме использует свойства криптографической хэш-функции для достижения консенсуса.

Что такое хэш биткоина?

Блокчейн биткоина использует SHA-256 (Secure Hash Algorithm). В 2001 году этот алгоритм был разработан Агентством национальной безопасности США.

Лежащий в основе биткоина алгоритм proof of work основывается на SHA-256. Используя его, биткоин-майнеры решают сложные математические задачи, чтобы добавить блоки в блокчейн. Биткоин-блоки добавляются путем проверки хэшей на основе лотереи.

Чтобы успешно добавить блок, майнет должен хэшировать заголовок блока таким образом, чтобы он был меньше или равным 256-битной последовательности. Хэш заголовка блока должен быть 256-битной буквенно-цифровой строкой и начинаться с нулей. Количество нулей вначале строки изменяется с изменением сложности майнинга и происходит после каждых добавленных 2020 блоках.

Майнеры стремятся найти конкретный хэш, изменяя небольшую часть заголовков блока, которая называется «nonce». «Nonce» всегда начинается с «0» и увеличивается каждый раз для получения требуемого хэша.

Шансы получить этот конкретный хэш, который начинается с множества нулей, очень низки. Поэтому майнеры предпринимают множество попыток, изменяя nonce.

И для этого требуется огромное количество вычислительных мощностей и аппаратных ресурсов, что доказывает, что значительная работа выполняется прежде чем добавить любой отдельный блок. Вот почему это называется «доказательством работы».

Таким образом, независимо от того, какой майнер первым получит правильный хэш биткоина, он выиграет в лотерею и получит вознаграждение в размере 12,5 BTC.

Практическое применение

Процедура хеширования относительно своего функционала может быть нескольких типов:

  1. Протокол для аудита целостности информации. В процессе передачи документов осуществляется вычисления хэш-кода. Результат передается вместе с документами. Прием информации сопровождается повторным вычислением хэш-кода с последующим сравнением, полученным значением. Несовпадение – ошибка. Этот алгоритм обладает высокими скоростными показателями при вычислении, но отличается нестабильностью и малым значением хэш-функции. Пример – протокол CRC-32, который имеет только 232 значения хэш, различающихся между собой.
  2. Криптографический алгоритм. Внедряется в качестве защиты от несанкционированного доступа (взлома). Проверяет систему на предмет искажения информации в момент передачи файлов по сети. При таких обстоятельствах «правильный» хэш имеет свободный доступ, а ключ, полученного документа, вычисляется при помощи разнообразных софтов (программ). Пример – SHA-1, SHA-2, MD5, отличающихся стабильностью и сложнейшим уравнением поиска коллизий.
  3. Протокол для создания эффективной информационной конструкции. Определяющая задача – структурирование информации в хэш-таблицы. Такая табличная структура делает возможным добавлять/удалять, находить нужные данные с невероятной скоростью.

Разберемся детальней в сфере применения протоколов хеширования.

Скачивание файлов из Всемирной Паутины

Этим занимается фактически каждый активный пользователь Всемогущей Сети, сталкиваясь с хэш-функциями сам того не осознавая, так как мало кто обращает внимание при скачивании того или иного файла на череду непонятных цифр и латинских букв. Однако именно они и есть хэш или контрольные суммы – перед вереницей символов стоит название используемой категории протокола хеширования

В общем-то, для обывателей абсолютно ненужная «инфа», а продвинутый юзер может выяснить, скачал ли он точную копию файла или произошла ошибка. Для этой процедуры необходимо установить на собственный ПК специальную утилиту (программу), которая способна вычислить хэш по представленному протоколу.

Алгоритм и электронно-цифровая подпись (ЭЦП)

Цифровая резолюция (подпись) – кодирование документа с использованием ключей закрытого и открытого типа. Другими словами, первоначальный документ сопровождается сообщением, закодированным закрытым ключом. Проверка подлинности электронной подписи осуществляется с применением открытого ключа. При обстоятельствах, когда в ходе сравнения хэш двух информационных наборов идентичен, документ, который получил адресат, признается оригинальным, а подпись истинной. В сухом остатке получаем высокую скорость обработки потока наборов данных, эффективную защиту виртуального факсимиле, так как подпись обеспечивается криптографической стойкостью. В качестве бонуса – хэш подразумевает использование ЭЦП под разнообразными типами информации, а не только текстовыми файлами.

Ревизия паролей

Очередная область применения хэш-функции, с которой сталкивается практически каждый пользователь. Подавляющее большинство серверов хранит пользовательские пароли в значении хэш. Что вполне обоснованно, так как, сберегая пароли пользователей в обычной текстовой форме, можно забыть о безопасности конфиденциальных, секретных данных. Столкнувшись с хэш-кодом, хакер даже время терять не будет, потому что, обратить вспять произвольный набор символов практически невозможно. Конечно же, если это не пароль в виде «12345» или что-то на подобии него. Доступ осуществляется путем сравнения хэш-кода вводимого юзером с тем, который хранится на сервере ресурса. Ревизию кодов может осуществлять простейшая хэш-функция.

Практическое использование хэша

Работа с большими объемами информации

Такой пример не часто встречается в реальной работе, но он наглядно показывает, насколько хэш-функция может облегчить работу с большими объемами информации.

Например, в массив из нескольких миллионов разных строк длиной 1 млн символов нужно добавить еще одну, при условии, что там ее еще нет. Чтобы не заниматься посимвольным сравнением каждой строки, можно предварительно вычислить хэш каждой из них, и уже сделать сравнение по нему. Вся работа упрощается и ускоряется в разы.

Проверка целостности данных при передаче

Для таких проверок часто используются простые хэш-функции.

Например, один пользователь передает другому определенный массив данных, а затем хэш от него. Получатель информации, захэшировав информацию у себя и сравнив хэши, может удостовериться, что он получил именно те данные, которые были отправлены.

В технологии блокчейн хэш также используется для проверки целостности данных. Хэш выступает гарантией целостности цепочки транзакций (платежей) и защищает ее от несанкционированных изменений. Благодаря ему и распределенным вычислениям взломать блокчен очень сложно.

Шифрование

На практике некоторые хэш-функции также используются для шифрования. Благодаря практически полностью хаотичному соответствию хэшей исходным данным, практически невозможно вычислить начальный массив данных. Такие хэш-функции должны быть очень стойкими к коллизиям, т.е. должна обладать минимальной вероятностью получения двух одинаковых хэшей для двух разных массивов данных. Расчеты по таким алгоритмам более сложные и требует больше времени, но зато отличаются надежностью.

Электронные цифровые подписи

Использование хэша в данной технологии позволяет пользователю, который подписывает документ, быть уверенным, что он подписывает именно тот документ, который требуется. Также хэш используется при формировании электронной цифровой подписи и аутентификации пользователей.

Хранение паролей

Для доступа к сайтам и серверам по логину и паролю тоже часто используют хэширование.

Пользователь регистрируется на сайте:

  • Заполняет форму регистрации, включая поле Пароль,
  • Пароль обрабатывается хэш-функцией и помещается в базу данных,
  • Оригинальное значение пароля нигде не используется.

Пользователь входит на сайт:

  • Вводит свой логин и пароль,
  • Пароль хэшируется и сравнивается с данными базы,
  • Если хэши совпадают, пользователя заходит на сайт.

Итеративные схемы

Изучим теперь то, каким образом могут быть выстроены криптографические алгоритмы хеширования. В числе самых распространенных схем решения данной задачи — задействование итеративной последовательной модели. Она основана на использовании так называемой сжимающей функции, при которой количество входных бит существенно больше, чем тех, что фиксируются на выходе.

Разумеется, сжимающая функция обязана соответствовать необходимым критериям криптостойкости. При интеративной схеме первая операция по обработке потока входных данных делится на блоки, размер которых исчисляется в битах. Соответствующий алгоритм также задействует временные переменные величиной в заданном количестве бит. В качестве первого значения задействуется общеизвестное число, в то время как последующие блоки данных объединяются со значением рассматриваемой функции на выходе. Значением хэша становятся выходные показатели бит для последней итерации, в которых учитывается весь входной поток, включая первое значение. Обеспечивается так называемый «лавинный эффект» хеширования.

Основная сложность, характеризующая реализуемое в виде итерационной схемы хеширование, — хэш-функции иногда сложно построить в том случае, если входной поток не является идентичным размеру блока, на который делится изначальный массив данных. Но в этом случае в стандарте хеширования могут быть прописаны алгоритмы, посредством которых исходный поток может быть расширен тем или иным образом.

В некоторых случаях в процессе обработки данных в рамках итерационной схемы могут быть задействованы так называемые многопроходные алгоритмы. Они предполагают формирование еще более интенсивного «лавинного эффекта». Подобный сценарий предполагает формирование повторных массивов данных, и только во вторую очередь идет расширение.

Name-That-Hash

С января 2021 года, почти через два года после того, как началась работа над HAITI, появился проект под названием Name-That-Hash, потому что автору требовалась библиотека Python для Ciphey. Теперь есть два актуальных варианта для идентификации хеша.

Name That Hash определяет тип хеша. Программа поддерживает MD5, SHA256 и более 300 других хешей.

Особенности Name That Hash:

  • Рейтинги популярности — Сначала вы увидите самые популярные хеши.
  • Сводки хешей — Name-that-hash выведет краткую информацию об основах использования каждого хеша, позволяя вам сделать осознанный выбор.
  • Цветной вывод — контрастный и наглядный.
  • Вывод в JSON и в API — вы можете использовать Name-That-Hash в своём проекте, поскольку программа имеет API и интерфейс командной строки. Используйте вывод JSON или импортируйте программу как модуль Python!
  • Актуальна — Name-That-Hash — это проект 2021 года.
  • Продуманность — авторы продумали функции, интерфейс и опции с мыслью об удобстве использования.
  • Расширяемость — добавляйте новые хеши так быстро, как только сможете редактировать текстовый файл.
  • Работа с файлами — программа считывает построчно файл и проверяет тип каждого хеша.
  • Поиск хешей — экстремальный режим, который пытается выделить хеш даже если строка содержит мусор.

Инструкцию по установке и полный список опций вы найдёте на странице https://kali.tools/?p=6626.

Для определения типа хеша укажите его с опцией -t (—text):

nth -t 'ХЕШ'

Например:

nth -t '7c2dc1d743735d4e069f3bda85b1b7e9172033dfdd8cd599ca094ef8570f3930c3f2c0b7afc8d6152ce4eaad6057a2ff22e71934b3a3dd0fb55a7fc84a53144e'

Пример вывода:

Хеши разбиты на две группы:

  • Most Likely — более вероятные варианты
  • Least Likely — менее вероятные варианты

Причём в этих группах они также отсортированы по частоте использования.

В выводе вы можете увидеть уже знакомые строки HC и JtR с номерами и названиями алгоритмов хеширования в Hashcat и John.

Кроме этого, имеется краткое описание применения, например:

  • Summary: Used in Bitcoin Blockchain and Shadow Files.
  • Summary: Used in Wireguard, Zcash, IPFS and more.
  • Summary: Not considered a hash function

Причём обратите внимание, некоторые записи являются гиперсылками (они подчёркнуты точками) и для получения дополнительной информации можно пройти на веб-страницу. Всё это делается для того, чтобы вы могли сориентироваться в предлагаемых типах хешей и выбрать наиболее подходящий.. Для проверки множества хешей используйте опцию -f (—file):

Для проверки множества хешей используйте опцию -f (—file):

nth -f 'ФАЙЛ'

Формат файла — один хеш на строку.

Одна из этих опций (-t или -f) являются обязательной.

Если ваши хеши кодированы в Base64, то используйте опцию -b64 (—base64). Она говорит программе перед идентификацией декодировать хеши из Base64. Для файлов со смешанными строками Base64 и в обычном тексте программа пытается вначале декодировать base64 и если это не получается, то трактует хеш как обычную строку без кодировки.

Пример:

nth -t 'ZjFlZmY1YzAzNjhkMTAzMTFkY2ZjNDE5Cg==' -b64

Обратите внимание, что в качестве хеша (после шапки) показана уже декодированная строка.

Опция -e (—extreme) включает поиск хешей в строке. Этот режим получит 5d41402abc4b2a76b9719d911017c592 из ####5d41402abc4b2a76b9719d911017c592###.

По идее, следующие две команды должны дать одинаковый результат:

nth -t '####5d41402abc4b2a76b9719d911017c592###' -e
nth -t '5d41402abc4b2a76b9719d911017c592'

Но у меня они получились разные. Поэтому используйте этот режим скорее как экспериментальный.

Применение хеш-функций

Рассмотрим несколько достаточно простых примеров применения хеш-функций:

• Проверка целостности сообщений и файловСравнивая хеш-значения сообщений, вычисленные до и после передачи, можно определить, были ли внесены какие-либо изменения в сообщение или файл.

• Верификация пароляПроверка пароля обычно использует криптографические хеши. Хранение всех паролей пользователей в виде открытого текста может привести к массовому нарушению безопасности, если файл паролей будет скомпрометирован. Одним из способов уменьшения этой опасности является хранение в базе данных не самих паролей, а их хешей. При выполнении хеширования исходные пароли не могут быть восстановлены из сохраненных хеш-значений, поэтому если вы забыли свой пароль вам предложат сбросить его и придумать новый.

• Цифровая подписьПодписываемые документы имеют различный объем, поэтому зачастую в схемах ЭП подпись ставится не на сам документ, а на его хеш. Вычисление хеша позволяет выявить малейшие изменения в документе при проверке подписи. Хеширование не входит в состав алгоритма ЭП, поэтому в схеме может быть применена любая надежная хеш-функция.

Предлагаю также рассмотреть следующий бытовой пример:

Алиса ставит перед Бобом сложную математическую задачу и утверждает, что она ее решила. Боб хотел бы попробовать решить задачу сам, но все же хотел бы быть уверенным, что Алиса не блефует. Поэтому Алиса записывает свое решение, вычисляет его хеш и сообщает Бобу (сохраняя решение в секрете). Затем, когда Боб сам придумает решение, Алиса может доказать, что она получила решение раньше Боба. Для этого ей нужно попросить Боба хешировать его решение и проверить, соответствует ли оно хеш-значению, которое она предоставила ему раньше.

Теперь давайте поговорим о SHA-3.

Хэширование Bitcoin SHA-256

Криптовалюты Биткоин же работает на алгоритме SHA-256, некой модификации сырого SHA-2. Только на выходе получается не 5 слов, как в первой версии, а целых 8. Восемь 32-х битных слов образуют хеш-сумму размером 256 бит — отсюда и название алгоритма. SHA—256 это классический алгоритм для криптовалют: на нем построена не только основная криптовалюта — Bitcoin, Но и Соответственно в форках bitcoin таких как Bitcoin Cash, Bitcoin Gold, Bitcoin Diamond. используется этот же алгоритм Помимо этих монет, SHA—256 используется также в: * Steemit; * DigiByte; * PeerCoin; * NameCoin; * TeckCoin; * Ocoin; * Zetacoin; * EmerCoin.И многих других Также алгоритм SHA-256 используется как подпрограмма в криптовалюте Litecoin, а основным алгоритмом для майнинга там является Scrypt.Но эти все монеты темы совсем другой рубрики, поэтому просто продолжим говорить о хешировании. Давайте систематизируем кое-что из уже сказанного.В общем процесс хеширования — это череда математических воздействий которым подвергаются данные произвольной длины для преобразования на выходе в битовую строку фиксированной длины. И Каждый из алгоритмов работает по своему, но хорошая хеш-функция должна обладать следующими свойствами

  1. Как уже было сказано, функция эта должна уметь приводить любой объем цифровых двоичных данных к числу заданной длины (по сути это сжатие до битовой последовательности заданной длины хитрым способом).
  2. При этом малейшее изменение (хоть на один бит) входных данных должно приводить к полному изменению хеша., то есть к лавинному эффекту
  3. Также Хеш функция должна быть стойкой к обратной операции, т.е. вероятность восстановления исходных данных по хешу должна быть весьма низкой, хотя это сильно зависит от задействованных над задачей обратного преобразования вычислительных мощностей
  4.  Еще В идеале хеш функция должна иметь как можно более низкую вероятность возникновения коллизий. Согласитесь, что не круто будет, если из разных массивов данных будут часто получаться одни и те же значения хэша
  5.  Также Хорошая хеш-функция не должна сильно нагружать железо при своем исполнении. От этого сильно зависит скорость работы системы на ней построенной. И хеш функций много и всегда имеется компромисс между скоростью работы и качеством получаемого результата.
  6. И еще очень желательно, чтобы Алгоритм работы функции должен быть открытым, чтобы любой желающий мог бы оценить ее криптостойкость, т.е. вероятность восстановления начальных данных по выдаваемому хешу.

Все это обязательные условия хорошей хеш функции и Хеширование очень важно для работы блокчейна. Как вы возможно знаете, все, что записано в блокчейне, уже никак нельзя изменить или удалить

А все потому, что данные в блокчейн записываются в виде хеш-суммы всего блока. А хеш-сумма блока рассчитывается с использованием хеш-суммы предыдущего блока, то есть исходная информация блока состоит не только от его содержания, но и в том числе и из хеш суммы предыдущего блока и поэтому Малейшее изменение данных в старом блоке вызовет эффект лавины, и блокчейн просто отбросит блок со странной хеш-суммой. Именно поэтому никто и никогда не смог взломать Биткоин. И именно поэтому советуют подождать шесть подтверждений в сети, чтобы сформировалось шесть и больше блоков, ведь вероятность, что один майнер посчитает шесть и больше блоков ничтожно мала, поэтому чем больше прошло времени и подтверждений после транзакции в сети биткоин, тем надежнее можно считать эту транзакцию. И это все связано с майнингом, который так-же основан на хешировании.

Дата публикации статьи: 1.12.2020

3.5. Нахождение коллизий для 7,5-раундовой функции сжатия ГОСТ Р

r2r4Рис. 4. Внутренняя фаза поиска коллизии для 7,5-раундовой функции сжатия ГОСТ Р

3.5.1. Внутренняя субфаза 1

  • Начинаем с разности в 8 байтах в первом столбце R3 и продвигаемся в обратном направлении к R2S.
  • Для каждой разности в 8 байтах в первом столбце R1P продвигаемся вперед до R2. Поскольку различных значений разности в R1P всего 264, мы можем получить 264 разностей для R2. После поиска соответствия данные разности приводят примерно к 264 действительным значениям. Однако, мы можем выполнять поиск соответствия для каждой строки независимо и получать 28 действительных значений для строки. Следовательно, трудоемкость генерации 264 действительных значений, соответствующих дифференциальному пути, составляет всего 28 раундовых преобразований.

964R2SR5

3.5.2. Внутренняя субфаза 2

R2SR564R2S64R5k3k4k564LPR2SR2LXk5-1Xk5PSTP-1L-1R5R2SR5Рис. 5. Внутренняя субфаза 2 атаки по нахождению коллизии для 7,5-раундовой функции сжатия ГОСТ РR2LR4SR2*T64R2SR564R2*T64R2*R2S64TR5R2*T96564R3*

  • Поскольку разность в R3* известна, для выбранного значения первой строки R3* вычисляем в прямом направлении значения первой строки R3L и разность для первой строки R4.
  • После выполнения поиска соответствия для разности первой строки R4 и R4S мы рассчитываем найти решение для первой строки R4. Поскольку первая строка значений R3L нам известна, мы можем далее вычислить значение первой строки k4.
  • Вычисляем первые строки для k3*, R2*, R4S и T. Поскольку для первой строки как R2*, так и R4S мы имеем около 264 значений, мы рассчитываем найти соответствие между ними. Другими словами, мы теперь соединили и значения, и разности для первой строки.

R2*T64k3*6464R2*T64128166412812812864R364R4SR3R4S64192

Клеточные автоматы

Клеточный автомат достаточно распространенная вещь, заслуживающая отдельного поста. Однако если коротко, то это дискретная модель, представляющая собой сетку произвольной размерности, каждая клетка которой в каждый момент времени может принимать одно из конечного множества состояний, и определено правило перехода клеток из одного состояния в другое.

В случае элементарных клеточных автоматов сетки ячеек имеют одномерное измерение.

В клеточном автомате для каждой ячейки существует набор других ячеек, называемых окрестностью, которые определяют следующее состояние ячейки. Начальное состояние — это состояние, в котором определены значения ячейки и их окрестности в момент времени t. Теперь новое поколение ячеек создается, когда «t» увеличивается на 1.

Выше представлены две соседние итерации для Правила 30, который определяется следующим образом:

Что можно для простоты интерпретировать в следующем виде:

Идеология

Как обычно (математик я, что уж тут поделать) сформулируем аксиомы, которые вкладываются в предложение:

Все передаваемые файлы делятся на главные (в основном html-страницы) и подчинённые (скрипты, изображения, стили и т.д.).
В идеологии, заложенной в стандарты HTTP-кэширования, все файлы равноправны

Это, конечно, толерантно, но не отвечает современным реалиям.

Неважно, откуда получен подчинённый файл. Важно, что его содержимое удовлетворяет нужды главного.
В существующей идеологии даже сама аббревиатура URI — Uniform Resource Identifier — предполагает, что идентификатором ресурса является его адрес в сети

Но, увы, для подчинённых файлов это несколько не соответствует действительности.

Гость форума
От: admin

Эта тема закрыта для публикации ответов.