From 4a1d913afa0f65f7f4fb80c7e50c3e6a33840f20 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Sat, 14 Sep 2024 22:02:28 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=D0=B8:=20-=20=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20Base64=20=D0=BD=D0=B0=20Java.m?= =?UTF-8?q?d=20-=20=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20SHA-256=20=D0=BD=D0=B0=20Java.md=20-=20Base64.md=20-?= =?UTF-8?q?=20=D0=9A=D0=BE=D0=B4=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85.md=20-=20=D0=A1?= =?UTF-8?q?=D0=B6=D0=B0=D1=82=D0=B8=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85.md=20-=20=D0=9A=D1=80=D0=B8=D0=BF=D1=82=D0=BE=D0=B3?= =?UTF-8?q?=D1=80=D0=B0=D1=84=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=20?= =?UTF-8?q?=D1=85=D0=B5=D1=88-=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F.m?= =?UTF-8?q?d=20-=20=D0=9A=D0=BE=D0=B4=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85.md=20=D0=B8?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D1=87=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev/algorithm/GZIP.md | 39 ++++++++++++ dev/architecture/Fingerprint.md | 4 +- dev/architecture/Latency.md | 2 +- dev/architecture/highload/Инвалидация кэша.md | 23 ++++++- dev/architecture/highload/Ключ кэширования.md | 61 +++++++++++++++++++ .../Кэширование на стороне браузера.md | 2 +- dev/architecture/Кэширование.md | 18 ++---- dev/cryptography/MD5.md | 45 ++++++++++++++ dev/cryptography/SHA-256.md | 39 ++++++++++++ .../Криптографическая хеш-функция.md | 26 ++++++++ dev/fundamental/Кодирование данных.md | 21 +++++++ dev/fundamental/Сжатие данных.md | 21 +++++++ dev/java/Мультимодульные проекты c Jandex.md | 7 +++ dev/other/Base64.md | 36 +++++++++++ dev/snippet/Реализация Base64 на Java.md | 55 +++++++++++++++++ dev/snippet/Реализация SHA-256 на Java.md | 51 ++++++++++++++++ ...иализация и Десериализация даты в Jackson.md | 7 ++- .../Сжатие изображений без потери качества.md | 5 +- meta/zero/00 Java разработка.md | 5 +- meta/zero/00 Криптография.md | 1 + meta/zero/00 Продуктивность.md | 7 +-- meta/zero/00 Снипеты для Java.md | 6 +- 22 files changed, 452 insertions(+), 29 deletions(-) create mode 100644 dev/algorithm/GZIP.md create mode 100644 dev/architecture/highload/Ключ кэширования.md create mode 100644 dev/cryptography/MD5.md create mode 100644 dev/cryptography/SHA-256.md create mode 100644 dev/cryptography/Криптографическая хеш-функция.md create mode 100644 dev/fundamental/Кодирование данных.md create mode 100644 dev/fundamental/Сжатие данных.md create mode 100644 dev/other/Base64.md create mode 100644 dev/snippet/Реализация Base64 на Java.md create mode 100644 dev/snippet/Реализация SHA-256 на Java.md diff --git a/dev/algorithm/GZIP.md b/dev/algorithm/GZIP.md new file mode 100644 index 00000000..b38bbaa0 --- /dev/null +++ b/dev/algorithm/GZIP.md @@ -0,0 +1,39 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-09-14 +zero-link: + - "[[../../meta/zero/00 Разработка|00 Разработка]]" +parents: + - "[[../fundamental/Сжатие данных|Сжатие данных]]" +linked: +--- +GZIP (GNU ZIP) — это формат сжатия данных и программное обеспечение, разработанное для сжатия и распаковки файлов. GZIP был создан в 1992 году Жан-Лу Гейли и Марком Адлером как замена более ранних программ сжатия данных, таких как Compress. GZIP основан на алгоритме DEFLATE, который сочетает в себе методы LZ77 (Lempel-Ziv 1977) и кодирование Хаффмана для эффективного сжатия данных. + +**Основные характеристики GZIP:** +- **Эффективное сжатие**: GZIP обеспечивает высокую степень сжатия данных, что позволяет значительно уменьшить размер файлов, особенно текстовых. +- **Скорость**: GZIP работает быстро и является эффективным как для сжатия, так и для распаковки данных. +- **Поддержка различных форматов**: GZIP сжимает данные в формате .gz, но не сохраняет структуру файлов и директорий (для этого используются архиваторы вроде tar). +- **Универсальность**: GZIP широко поддерживается в Unix-подобных системах (Linux, BSD), а также доступен на Windows и других платформах. +- **Использование заголовков**: GZIP добавляет к сжатому файлу заголовок, который содержит метаданные, такие как имя оригинального файла, временная метка и контрольная сумма CRC32 для проверки целостности данных. + +**Применения GZIP:** +- **Сжатие файлов**: Используется для сжатия отдельных файлов, что экономит место на диске и уменьшает время передачи данных. +- **Веб-технологии**: GZIP часто используется для сжатия веб-контента (HTML, CSS, JavaScript) перед отправкой с сервера на клиент, что ускоряет загрузку веб-страниц. +- **Архивирование**: В Unix-подобных системах GZIP часто используется вместе с утилитой tar для создания архивов (tar.gz или .tgz), которые содержат несколько файлов и директорий. +- **Протоколы передачи данных**: Протоколы, такие как HTTP и FTP, поддерживают сжатие GZIP для уменьшения объема передаваемых данных. + +**Реализации:** +- [[../../../../_inbox/Реализация GZIP в Java|Реализация GZIP в Java]] +- [[../../../../_inbox/GZIP сжатие в Nginx|GZIP сжатие в Nginx]] + +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Разработка|00 Разработка]] +**Родитель**:: [[../fundamental/Сжатие данных|Сжатие данных]] +**Источник**:: +**Создана**:: [[2024-09-14]] +**Автор**:: +### Дополнительные материалы +- \ No newline at end of file diff --git a/dev/architecture/Fingerprint.md b/dev/architecture/Fingerprint.md index c530da02..420ea2db 100644 --- a/dev/architecture/Fingerprint.md +++ b/dev/architecture/Fingerprint.md @@ -14,9 +14,9 @@ linked: Самый простой способ побороть эту проблему, это использовать fingerprint файла. То есть, когда файл меняется, вы меняете его название. Делается это обычно добавлением какого-нибудь префикса/суфикса к названию файла. -Например у нас есть файл стилей `style.css`, мы можем посчитать для него MD5 хэш и добавить его в название. Тогда у нас получится следующее название: `style.e626dd36e0085927f334adbe3eb38e7a.css`. +Например у нас есть файл стилей `style.css`, мы можем посчитать для него [[../cryptography/MD5|MD5]] хеш и добавить его в название. Тогда у нас получится следующее название: `style.e626dd36e0085927f334adbe3eb38e7a.css`. -При любом изменении файла MD5 хэш должен пересчитываться. Таким образом при изменении файла у него будет другое название, и браузер будет вынужден скачать его в любом случае. +При любом изменении файла [[../cryptography/MD5|MD5]] хеш должен пересчитываться. Таким образом при изменении файла у него будет другое название, и браузер будет вынужден скачать его в любом случае. *** ## Мета информация **Область**:: [[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]] diff --git a/dev/architecture/Latency.md b/dev/architecture/Latency.md index 3e959b3d..a7b1b03f 100644 --- a/dev/architecture/Latency.md +++ b/dev/architecture/Latency.md @@ -26,7 +26,7 @@ Latency - это время, необходимое для выполнения - **Использование кэширования**: [[Кэширование]] часто запрашиваемых данных на сервере или ближе к клиенту может существенно сократить время доступа к этим данным, поскольку избавляет от необходимости каждый раз обращаться к основному источнику данных. - **Оптимизация базы данных**: Индексация, оптимизация запросов и структур данных, а также выбор подходящего типа базы данных могут снизить время доступа к данным - **Минимизация расстояния**: Размещение серверов ближе к конечным пользователям или использование сети доставки контента ([CDN](highload/Content%20Delivery%20Network.md)) может снизить физическую задержку, связанную с расстоянием, которое должны преодолеть данные. -- **Сокращение объема передаваемых данных**: Минимизация размера данных, передаваемых между клиентом и сервером (например, сжатие данных и изображений), может уменьшить время их передачи. +- **Сокращение объема передаваемых данных**: Минимизация размера данных, передаваемых между клиентом и сервером (например, [[../fundamental/Сжатие данных|сжатие данных]] и изображений), может уменьшить время их передачи. *** ## Мета информация **Область**:: [[../../meta/zero/00 HighLoad|00 HighLoad]] diff --git a/dev/architecture/highload/Инвалидация кэша.md b/dev/architecture/highload/Инвалидация кэша.md index b99bd28d..8a8df711 100644 --- a/dev/architecture/highload/Инвалидация кэша.md +++ b/dev/architecture/highload/Инвалидация кэша.md @@ -25,9 +25,28 @@ linked: Дополнительно для работы со статическими файлами можно отменить [[../Fingerprint|Fingerprint]]. -Один из подходов это инвалидация по времени. Для кэшированных данных устанавливается TTL, и по прошествию времени кэш удаляется. Такое вариант подходит для редко изменяемых данных, устаревание которых не приводит к серьезным проблемам в бизнес-логике, например словари. При таком варианте важно подобрать оптимальное время жизни кэша, слишком маленькое время жизни будет давать плохую производительность, слишком большое ухудшит опыт пользователей. В оценке эффективности кэша поможет метрика [[CacheMissRate]]. +## Инвалидация по TTL +Один из подходов это инвалидация по времени. Для кэшированных данных устанавливается TTL, и по прошествию времени кэш удаляется. Такое вариант подходит для редко изменяемых данных, устаревание которых не приводит к серьезным проблемам в бизнес-логике, например словари. -Некоторые чувствительные данные нужно инвалидировать сразу при изменении. Тут может помочь тегирование ключей. +При таком варианте важно подобрать оптимальное время жизни кэша, слишком маленькое время жизни будет давать плохую производительность, слишком большое ухудшит опыт пользователей. В оценке эффективности кэша поможет метрика [[CacheMissRate]]. + +Если просто установить TTL, то спустя какое-то время он истечет и данные будут удалены, но что если к ним постоянно обращаются. В некоторых случаях я использую подход, при котором при запросе данных из кэша проверяется оставшийся TTL, и если он меньше, чем некоторое значение, то TTL устанавливается заново. + +Данные остаются в кэше, если ими активно пользуются. В таком случае при обновлении данных, необходимо вручную положить новые данные или инвалидировать кэш по событиям. + +```lua +local key = KEYS[1]; +local threshold = tonumber(ARGV[1]); +local new_ttl = tonumber(ARGV[2]); +local value = redis.call('get', key); +if value then + local ttl = redis.call('pttl', key); + if ttl >= 0 and ttl <= threshold then + redis.call('pexpire', key, new_ttl); + end; +end; +return value; +``` *** ## Мета информация **Область**:: [[../../../meta/zero/00 HighLoad|00 HighLoad]] diff --git a/dev/architecture/highload/Ключ кэширования.md b/dev/architecture/highload/Ключ кэширования.md new file mode 100644 index 00000000..d9ddc896 --- /dev/null +++ b/dev/architecture/highload/Ключ кэширования.md @@ -0,0 +1,61 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-09-13 +zero-link: + - "[[../../../meta/zero/00 HighLoad|00 HighLoad]]" +parents: + - "[[Кэширование]]" +linked: +--- +Представим, что нам нужно кэшировать результат работы следующего метода: + +```java +public List getUsersByType(String userType, Set userIds) +``` + +Метод принимает 2 аргумента: строку и коллекцию. Ключ кэширования должен учитывать значения этих входящих аргументов и должен обладать следующими свойствами: +- При изменении параметров, ключ кэширования также должен изменяться. В данном случае, если изменятся значения аргументов `userType` и `userIds`, мы должны получить новое значение ключа. +- По параметрам ключ должен определяться однозначно, то есть для одних и тех же значений аргументов ключ кэширования должен принимать только одно значение. Иначе мы рискуем понизить эффективность процесса кэширования, создавая несколько кэшей для одной и той же выборки. + +Сформируем ключ кэширования для нашего метода. В качестве хранилища будем использовать [[Redis]]. + +В начале ключа я обычно обязательно указываю какой-то уникальный префикс сервиса, чтобы не получить коллизию между разными сервисами. Пускай в данном случае префикс будет `USER_SERVICE`. Также добавляю уникальный префикс метода, в данном случае будет `USERS`. + +В качестве разделителей рекомендую использовать `:`, в [[../../../../../_inbox/Redis|Redis]] это позволяет визуально сгруппировать ключи. Это позволяет визуально группировать ключи при использовании UI клиента. Таким образом начало нашего ключа выглядит следующим образом: `USER_SERVICE:USERS:`. + +Значения аргументов метода также должны попасть в ключ. Возьмем наш первый аргумент `String userType`. Для аргумента также можно использовать префиксы, но это не обязательно. В данном случае пусть будет `USER_TYPE`. А вот для самого значения параметра есть несколько вариантов: +- Оставить строкой и просто выполнить конкатенацию. +- Использовать [[../../cryptography/Криптографическая хеш-функция|хеш-функцию]] с фиксированной длиной выхода, например [[../../cryptography/MD5|MD5]]. Фиксированная длина выхода нужна, чтобы иметь предсказуемую и ограниченную длину ключа. + +Оставим просто строкой, так как тип пользователя вряд ли может быть длинным. В итоге пока наш ключ выглядит как-то так: `USER_SERVICE:USERS:USER_TYPE:VIP:`. + +Переходим ко второму аргументу `Set userIds`. С коллекцией все будет сложнее. Мы точно должны использовать какую-нибудь [[../../cryptography/Криптографическая хеш-функция|хеш-функцию]], но как? + +> [!WARNING] Disclamer +> Этот способ я придумал сам, возможно он не самый удачный, но он работает. Если вы придумаете лучше, напишите в комментариях ниже 👇 + +Во-первых, коллекцию необходимо предварительно отсортировать. Иначе на одинаковые параметры коллекций мы будем получать разные результаты [[../../cryptography/Криптографическая хеш-функция|хеш-функции]]. + +Во-вторых, нужно представить коллекцию как что-то понятное для [[../../cryptography/Криптографическая хеш-функция|хеш-функции]]. Для этого я преобразую коллекцию в JSON. JSON используется, потому что ваша коллекция может быть из сложных объектов. + +Теперь используем [[../../cryptography/SHA-256|SHA-256]], чтобы из нашей строки получить какой-то хеш. И уже этот хеш мы добавляем к нашему ключу, получается примерно такое: + +``` +USER_SERVICE:USERS:USER_TYPE:VIP:USER_ID:315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3 +``` + +> [!QUESTION] Почему SHA-256, а не MD5? +> [[../../cryptography/MD5|MD5]] подвержен коллизиям, [[../../cryptography/SHA-256|SHA-256]] считается более устойчивым к коллизиям. + + +*** +## Мета информация +**Область**:: [[../../../meta/zero/00 HighLoad|00 HighLoad]] +**Родитель**:: [[../Кэширование|Кэширование]] +**Источник**:: +**Создана**:: [[2024-09-13]] +**Автор**:: +### Дополнительные материалы +- [[../../snippet/Реализация SHA-256 на Java|Реализация SHA-256 на Java]] \ No newline at end of file diff --git a/dev/architecture/highload/Кэширование на стороне браузера.md b/dev/architecture/highload/Кэширование на стороне браузера.md index d4cb6d51..c21acc66 100644 --- a/dev/architecture/highload/Кэширование на стороне браузера.md +++ b/dev/architecture/highload/Кэширование на стороне браузера.md @@ -13,7 +13,7 @@ linked: Обычно кэшируются только GET запросы, так как они должны быть [[../Идемпотентность|идемпотентны]]. Заголовки для кэширования: -- ETAG. Тег, который позволяет указать версию файла. Можно использовать MD5. +- ETAG. Тег, который позволяет указать версию файла. Можно использовать [[../../cryptography/MD5|MD5]]. - If-Modified-Since. Дата изменения файла. - Cache-Control - public - Сохранять может не только браузер, но и промежуточные узлы diff --git a/dev/architecture/Кэширование.md b/dev/architecture/Кэширование.md index 21fb19cd..7fc6203c 100644 --- a/dev/architecture/Кэширование.md +++ b/dev/architecture/Кэширование.md @@ -16,12 +16,12 @@ linked: > [!TIP] Работа без кэша > Хорошая система должна уметь выдерживать нагрузку и без кэша. Задача кэша ускорить ответ, а не держать нагрузку. -==Системы используемые для кэширования обычно не являются надежными, так что не следует хранить только там какие-то важные данные.== Чаще всего кэш реализуется на основе хэш-таблиц и использует [принцип локальности](../fundamental/Принцип%20локальности.md). - Сами данные можно разделить на несколько категорий: - **Можно потерять**. К этой категории относятся кэши выборок из базы данных. Потеря таких ключей не так страшна, потому что мы можем легко восстановить их значения, обратившись заново к backend’у. Однако частые потери кэшей приводят к излишним обращениям к БД. - **Не хотелось бы потерять**. Здесь можно упомянуть счетчики посетителей сайта, просмотров ресурсов и т.п. Хоть и восстановить эти значения иногда напрямую невозможно, но значения этих ключей имеют ограниченный по времени смысл: через несколько минут их значение уже неактуально, и будет рассчитано заново. - **Совсем не должны терять**. Кэш удобен для хранения сессий пользователей. Однако содержимое сессий не хотелось бы терять никогда – иначе пользователей на сайте будет «разлогинивать». Как попытаться избежать? Можно кластеризовать систему кэширования, так вероятность потери снижается. + +==Системы используемые для кэширования обычно не являются надежными, так что не следует хранить только там какие-то важные данные.== ## Уровни кэширования ![](../../meta/files/images/Pasted%20image%2020240617195054.png) @@ -37,20 +37,14 @@ linked: - Сквозное. Все запросы проходят через кэш. [Схема](../../meta/files/images/Pasted%20image%2020240617194731.png). - Кэширование на стороне сервиса. [Схема](../../meta/files/images/Pasted%20image%2020240617194759.png). - Опережающее. Кладем данные в кэш заранее. [Схема](../../meta/files/images/Pasted%20image%2020240617194938.png). -## Ключ кэширования -Ключ кэширования должен обладать следующими свойствами: -- При изменении параметров выборки, которую мы кэшируем, ключ кэширования должен изменяться (чтобы с новыми параметрами мы не «попали» в старый кэш). -- По параметрам выборки ключ должен определяться однозначно, т.е. для одной и той же выборки ключ кэширования должен быть только один, иначе мы рискуем понизить эффективность процесса кэширования, создавая несколько кэшей для одной и той же выборки. -Можно использовать следующий вариант (пример для PHP): если существует некоторая точка в коде, через которую проходят все обращения к БД, а любое обращение полностью описывается (содержит все параметры запроса) в некоторой структуре `$options`, можно использовать следующий ключ: +Чаще всего кэш реализуется на основе хеш-таблиц и использует [принцип локальности](../fundamental/Принцип%20локальности.md). Для работы с хеш-таблицей вам необходим [[highload/Ключ кэширования|ключ кэширования]] и сами данные. По ключу данные кладутся и забираются из таблицы. -```php -$key = md5(serialize($options)) -``` +Для хранения результатов кэширования я обычно использую JSON. Использую для этого библиотеку [[../../../../knowledge/dev/java/other/Jackson|Jackson]], но есть один [[../../../../_inbox/Преобразование Json из коллекции в Java объект при помощи Jackson|нюанс при работе с коллекциям]], который стоит учитывать. -Такой ключ удовлетворяет первому условию: при изменении `$options` будет обязательно изменен `$key`, но и второе условие будет соблюдаться, если мы будем все типы данных в $options использовать «канонически», т.е. не допускать строки `"1"` вместо числа `1`. Функция `md5` используется для «сжатия» данных. +При желании результат кэширования можно сжать используя [[../algorithm/GZIP|GZIP]]. Однако, приходится использовать [[../other/Base64|Base64]], чтобы преобразовать байты полученные от gzip в строку, и уже в таком виде положить в Redis. Не смотря на то, что Base64 увеличивает размер строки на 33% все равно получается намного компактнее, чем просто JSON. -Если мы закэшировали какие-то данные от backend’а, например, выборку из БД, рано или поздно исходные данные изменяются, и кэш перестает быть валидным. Причем очень желательно, чтобы кэш сбрасывался сразу же за изменением. За это отвечает [[highload/Инвалидация кэша|Инвалидация кэша]] +Рано или поздно исходные данные изменяются, и кэш перестает быть валидным. Часто важно, чтобы кэш сбрасывался сразу же за изменением. За это отвечает [[highload/Инвалидация кэша|Инвалидация кэша]] *** ## Мета информация **Область**:: [[../../meta/zero/00 HighLoad|00 HighLoad]] diff --git a/dev/cryptography/MD5.md b/dev/cryptography/MD5.md new file mode 100644 index 00000000..e3d2581c --- /dev/null +++ b/dev/cryptography/MD5.md @@ -0,0 +1,45 @@ +--- +aliases: + - Message Digest Algorithm 5 +tags: + - maturity/🌱 +date: 2024-09-14 +zero-link: + - "[[../../meta/zero/00 Криптография|00 Криптография]]" + - "[[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]" +parents: + - "[[Криптографическая хеш-функция]]" +linked: +--- +MD5 (Message Digest Algorithm 5) — это [[криптографическая хеш-функция]], которая преобразует входные данные в 128-битное (16-байтное) значение, называемое хешем или дайджестом сообщения. + + +> [!DANGER] +> Сегодня MD5 считается устаревшим и небезопасным для большинства криптографических приложений. В современных системах вместо MD5 рекомендуется использовать более безопасные алгоритмы, такие как [[SHA-256]] или SHA-3, которые обладают лучшей устойчивостью к коллизиям и другим атакам. + + +Широко используется для проверки целостности данных и в других криптографических задачах. + +**Основные характеристики MD5:** +- **Фиксированная длина выхода**: Независимо от размера входных данных (например, текст или файл), хеш всегда имеет длину 128 бит (16 байт). +- **Однонаправленность**: MD5 является однонаправленной функцией, что означает, что невозможно восстановить исходные данные по их хешу. +- **Быстродействие**: MD5 работает быстро и эффективно, что сделало его популярным для использования в приложениях, где требуется быстрая обработка данных. + +**Недостатки MD5:** +- **Уязвимость к коллизиям**: MD5 подвержен коллизиям, что означает, что существует возможность найти два различных входа, которые дают одинаковый хеш. Это делает MD5 небезопасным для криптографических применений, таких как цифровые подписи и сертификаты. +- **Атаки на предобраз**: Существуют методы, позволяющие найти вход, соответствующий заданному хешу, что еще больше подрывает надежность MD5. +- **Низкая устойчивость к криптографическим атакам**: Со временем были разработаны более мощные алгоритмы, такие как [[SHA-256|SHA-256]] и SHA-3, которые обеспечивают лучшую безопасность по сравнению с MD5. + +**Применения MD5:** +- **Проверка целостности данных**: Используется для проверки целостности файлов и данных, например, в контексте загрузки программного обеспечения, где MD5 хеши публикуются вместе с файлами для проверки их целостности. +- **Создание контрольных сумм**: MD5 был популярен для создания контрольных сумм файлов, чтобы быстро проверить, не были ли файлы изменены. +- **Идентификаторы и хеширование строк**: MD5 использовался для создания уникальных идентификаторов и хеширования паролей (хотя сейчас это считается небезопасной практикой). +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Криптография|00 Криптография]] +**Родитель**:: [[Криптографическая хеш-функция]] +**Источник**:: +**Создана**:: [[2024-09-14]] +**Автор**:: +### Дополнительные материалы +- \ No newline at end of file diff --git a/dev/cryptography/SHA-256.md b/dev/cryptography/SHA-256.md new file mode 100644 index 00000000..bbf42e9e --- /dev/null +++ b/dev/cryptography/SHA-256.md @@ -0,0 +1,39 @@ +--- +aliases: + - Secure Hash Algorithm 256-bit + - SHA256 +tags: + - maturity/🌱 +date: 2024-09-14 +zero-link: + - "[[../../meta/zero/00 Криптография|00 Криптография]]" + - "[[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]" +parents: + - "[[Криптографическая хеш-функция]]" +linked: +--- +SHA-256 (Secure Hash Algorithm 256-bit) — это [[криптографическая хеш-функция]], которая преобразует входные данные в 256-битное (32-байтное) значение, называемое хешем. SHA-256 является частью семейства алгоритмов SHA-2. + +**Основные характеристики SHA-256:** +- **Фиксированная длина выхода**: Независимо от размера входных данных (например, файл, текст, строка), выход всегда имеет длину 256 бит (32 байта). +- **Однонаправленность**: Хеш-функция является однонаправленной, что означает, что по хешу невозможно восстановить исходные данные. +- **Устойчивость к коллизиям**: Вероятность нахождения двух различных входов, которые дают один и тот же хеш, чрезвычайно мала, что делает SHA-256 устойчивой к коллизиям. +- **Устойчивость к предобразу**: Трудно найти вход, который соответствует заданному хешу. +- **Быстродействие**: SHA-256 работает достаточно быстро для большинства приложений, включая цифровые подписи, контроль целостности данных и криптографические протоколы. + +**Применения SHA-256:** +- **Хранение паролей**: Хеширование паролей перед хранением для защиты от утечек данных. +- **Контроль целостности данных**: Проверка целостности файлов или сообщений с помощью хеша. +- **Криптовалюты**: SHA-256 используется в алгоритме доказательства работы (Proof-of-Work) в блокчейне Bitcoin. +- **Цифровые подписи**: Используется для создания цифровых подписей, которые подтверждают подлинность и целостность сообщений. + +**Реализации:** +- [[../snippet/Реализация SHA-256 на Java|Реализация SHA-256 на Java]] +## Мета информация +**Область**:: [[../../meta/zero/00 Криптография|00 Криптография]], [[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]] +**Родитель**:: [[Криптографическая хеш-функция]] +**Источник**:: +**Создана**:: [[2024-09-14]] +**Автор**:: +### Дополнительные материалы +- \ No newline at end of file diff --git a/dev/cryptography/Криптографическая хеш-функция.md b/dev/cryptography/Криптографическая хеш-функция.md new file mode 100644 index 00000000..8392e05e --- /dev/null +++ b/dev/cryptography/Криптографическая хеш-функция.md @@ -0,0 +1,26 @@ +--- +aliases: + - хеш-функция + - хеш-функцию + - хеш функция + - хеш функции + - хеш-функции +tags: + - maturity/🌱 +date: 2024-09-14 +zero-link: + - "[[../../meta/zero/00 Криптография|00 Криптография]]" +parents: +linked: +--- +- [[MD5]] +- [[SHA-256]] +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Криптография|00 Криптография]] +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-09-14]] +**Автор**:: +### Дополнительные материалы +- \ No newline at end of file diff --git a/dev/fundamental/Кодирование данных.md b/dev/fundamental/Кодирование данных.md new file mode 100644 index 00000000..d5436bb9 --- /dev/null +++ b/dev/fundamental/Кодирование данных.md @@ -0,0 +1,21 @@ +--- +aliases: + - кодирования данных +tags: + - maturity/🌱 +date: 2024-09-14 +zero-link: + - "[[../../meta/zero/00 Разработка|00 Разработка]]" +parents: +linked: +--- +- [[../other/Base64|Base64]] +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Разработка|00 Разработка]] +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-09-14]] +**Автор**:: +### Дополнительные материалы +- \ No newline at end of file diff --git a/dev/fundamental/Сжатие данных.md b/dev/fundamental/Сжатие данных.md new file mode 100644 index 00000000..fb541e06 --- /dev/null +++ b/dev/fundamental/Сжатие данных.md @@ -0,0 +1,21 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-09-14 +zero-link: + - "[[../../meta/zero/00 Разработка|00 Разработка]]" +parents: +linked: +--- +- [[../algorithm/GZIP|GZIP]] +- [[../snippet/Сжатие изображений без потери качества|Сжатие изображений без потери качества]] +*** +## Мета информация +**Область**:: +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-09-14]] +**Автор**:: +### Дополнительные материалы +- \ No newline at end of file diff --git a/dev/java/Мультимодульные проекты c Jandex.md b/dev/java/Мультимодульные проекты c Jandex.md index e2c3e0c0..8143d947 100644 --- a/dev/java/Мультимодульные проекты c Jandex.md +++ b/dev/java/Мультимодульные проекты c Jandex.md @@ -18,6 +18,10 @@ linked: Пример настройки в корневом `build.gradle` ```gradle +plugins { + id("org.kordamp.gradle.jandex") version "2.0.0" +} + buildscript { repositories { gradlePluginPortal() @@ -31,6 +35,9 @@ buildscript { apply plugin: "org.kordamp.gradle.jandex" subprojects { + + apply plugin: "org.kordamp.gradle.jandex" + tasks.withType(Javadoc).configureEach { dependsOn('jandex') options.encoding = 'UTF-8' diff --git a/dev/other/Base64.md b/dev/other/Base64.md new file mode 100644 index 00000000..8774e01a --- /dev/null +++ b/dev/other/Base64.md @@ -0,0 +1,36 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-09-14 +zero-link: + - "[[../../meta/zero/00 Разработка|00 Разработка]]" +parents: + - "[[../garden/ru/dev/fundamental/Кодирование данных|Кодирование данных]]" +linked: +--- +Base64 — это метод [[../fundamental/Кодирование данных|кодирования данных]], который преобразует двоичные данные (например, файлы, изображения, или любой другой тип бинарных данных) в текстовый формат, используя набор из 64 символов (буквы латинского алфавита, цифры, а также символы + и /). Base64 часто используется для передачи данных через текстовые среды, такие как электронная почта или URL, где могут быть ограничения на использование двоичных данных. + +**Основные характеристики Base64:** +- **Кодирование и декодирование**: Base64 преобразует каждый триплет байтов (24 бита) входных данных в четыре символа (по 6 бит каждый). В случае, если количество байтов не кратно трём, на выход добавляются один или два символа = для заполнения. +- **Читаемый текстовый формат**: Закодированные данные выглядят как обычный текст, состоящий из букв, цифр и нескольких специальных символов. +- **Преобразование размера**: Закодированные Base64 данные увеличиваются в размере примерно на 33% по сравнению с исходными двоичными данными. +- **Безопасность и надежность передачи**: Base64 кодирование не является средством защиты данных, оно не обеспечивает шифрования. + +**Применения Base64:** +- **Электронная почта (MIME)**: Используется для кодирования вложений в электронных письмах, чтобы их можно было безопасно передать через SMTP, который поддерживает только текст. +- **Web**: Используется для передачи данных через URL или в JSON, а также для встраивания изображений и других медиафайлов в HTML и CSS. +- **Кодирование API**: Используется для кодирования данных в API запросах, особенно когда нужно передать бинарные данные в JSON. +- **Хранение данных**: В некоторых базах данных или конфигурационных файлах может быть удобно хранить бинарные данные в текстовом формате. + +**Реализации:** +- [[../snippet/Реализация Base64 на Java|Реализация Base64 на Java]] +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Разработка|00 Разработка]] +**Родитель**:: [[../fundamental/Кодирование данных|Кодирование данных]] +**Источник**:: +**Создана**:: [[2024-09-14]] +**Автор**:: +### Дополнительные материалы +- \ No newline at end of file diff --git a/dev/snippet/Реализация Base64 на Java.md b/dev/snippet/Реализация Base64 на Java.md new file mode 100644 index 00000000..b130ef33 --- /dev/null +++ b/dev/snippet/Реализация Base64 на Java.md @@ -0,0 +1,55 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-09-14 +zero-link: + - "[[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]" +parents: + - "[[../other/Base64]]" +linked: +--- + +**Кодирование данных в Base64:** +```java +import java.util.Base64; + +public class Base64EncodingExample { + + public static void main(String[] args) { + // Пример строки для кодирования + String originalString = "This is a test string for Base64 encoding."; + + // Кодирование строки в Base64 + String encodedString = Base64.getEncoder().encodeToString(originalString.getBytes()); + System.out.println("Encoded String: " + encodedString); + } +} +``` + +**Декодирование данных из Base64:** +```java +import java.util.Base64; + +public class Base64DecodingExample { + + public static void main(String[] args) { + // Пример закодированной строки Base64 + String encodedString = "VGhpcyBpcyBhIHRlc3Qgc3RyaW5nIGZvciBCYXNlNjQgZW5jb2Rpbmcu"; + + // Декодирование строки из Base64 + byte[] decodedBytes = Base64.getDecoder().decode(encodedString); + String decodedString = new String(decodedBytes); + System.out.println("Decoded String: " + decodedString); + } +} +``` +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]] +**Родитель**:: [[../other/Base64|Base64]] +**Источник**:: +**Создана**:: [[2024-09-14]] +**Автор**:: +### Дополнительные материалы +- \ No newline at end of file diff --git a/dev/snippet/Реализация SHA-256 на Java.md b/dev/snippet/Реализация SHA-256 на Java.md new file mode 100644 index 00000000..665b981d --- /dev/null +++ b/dev/snippet/Реализация SHA-256 на Java.md @@ -0,0 +1,51 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-09-14 +zero-link: + - "[[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]" + - "[[../../meta/zero/00 Криптография|00 Криптография]]" +parents: + - "[[../cryptography/SHA-256|SHA-256]]" +linked: +--- +Преобразование строки в [[../cryptography/SHA-256|SHA-256]]: + +```java +public class SHA { + + public static String hashSha256(String data) { + try { + final MessageDigest digest = MessageDigest.getInstance("SHA-256"); + byte[] encodedHash = digest.digest(data.getBytes(StandardCharsets.UTF_8)); + return bytesToHex(encodedHash); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("Cannot find SHA-256 algorithm", e); + } + } + + private static String bytesToHex(byte[] hash) { + final StringBuilder hexString = new StringBuilder(); + for (byte b : hash) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + return hexString.toString(); + } + +} +``` + +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]], [[../../meta/zero/00 Криптография|00 Криптография]] +**Родитель**:: [[../cryptography/SHA-256|SHA-256]] +**Источник**:: +**Создана**:: [[2024-09-14]] +**Автор**:: +### Дополнительные материалы +- \ No newline at end of file diff --git a/dev/snippet/Сериализация и Десериализация даты в Jackson.md b/dev/snippet/Сериализация и Десериализация даты в Jackson.md index 52dad19d..609eb2b4 100644 --- a/dev/snippet/Сериализация и Десериализация даты в Jackson.md +++ b/dev/snippet/Сериализация и Десериализация даты в Jackson.md @@ -5,8 +5,9 @@ tags: date: 2023-11-20 zero-link: - "[[../../../../garden/ru/meta/zero/00 Снипеты для Java|00 Снипеты для Java]]" -parents: -linked: +parents: + - "[[../../../../knowledge/dev/java/other/Jackson|Jackson]]" +linked: --- Чаще всего по работе я сталкиваюсь с проблемой десериализации и сериализации даты. Многие разработчики отступают от стандартного формата времени `yyyy-MM-dd'T'HH:mm:ss*SSSZZZZ` и изобретают свои форматы. @@ -109,7 +110,7 @@ public class Foo { *** ## Мета информация **Область**:: [[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]] -**Родитель**:: +**Родитель**:: [[../../../../knowledge/dev/java/other/Jackson|Jackson]] **Источник**:: **Автор**:: **Создана**:: [[2023-11-20]] diff --git a/dev/snippet/Сжатие изображений без потери качества.md b/dev/snippet/Сжатие изображений без потери качества.md index d542a876..6f9025cb 100644 --- a/dev/snippet/Сжатие изображений без потери качества.md +++ b/dev/snippet/Сжатие изображений без потери качества.md @@ -4,7 +4,8 @@ tags: date: 2023-11-20 zero-link: - "[[../../meta/zero/00 Снипеты на bash|00 Снипеты на bash]]" -parents: +parents: + - "[[../garden/ru/dev/fundamental/Сжатие данных|Сжатие данных]]" linked: --- Размер изображений составляет существенную часть от размера страницы сайта. Поэтому часто я сжимаю изображения на своих сайтах. В этой заметке рассказываю какими способами я это делаю. @@ -112,7 +113,7 @@ CPU time decode 1.074758, encode 16.759768, other 0.018592, total 17.899076 sec *** ## Мета информация **Область**:: [[../../meta/zero/00 Снипеты на bash|00 Снипеты на bash]] -**Родитель**:: +**Родитель**:: [[../fundamental/Сжатие данных|Сжатие данных]] **Источник**:: **Автор**:: **Создана**:: [[2023-11-20]] diff --git a/meta/zero/00 Java разработка.md b/meta/zero/00 Java разработка.md index 6c286d63..56675b8a 100644 --- a/meta/zero/00 Java разработка.md +++ b/meta/zero/00 Java разработка.md @@ -9,13 +9,16 @@ title: Java разработка - [Устройство Java](Устройство%20Java.md) - [JDK](../../dev/java/JDK.md) - [[../../dev/java/Java Reflection|Java Reflection]] -- [Снипеты для Java](00%20Снипеты%20для%20Java.md) - Системы сборки - [Maven](00%20Maven.md) + - [[00 Gradle|Gradle]] - Фреймворки - [Quarkus](00%20Quarkus.md) - [SpringBoot](00%20SpringBoot.md) +- Библиотеки - [Hibernate](00%20Hibernate.md) + - [[../../../../knowledge/dev/java/other/Jackson|Jackson]] +- [Снипеты для Java](00%20Снипеты%20для%20Java.md) ## Мои рассуждения - [Использование wildcard imports в Java](../../dev/java/Использование%20wildcard%20imports%20в%20Java.md) - [Сравнение константы слева в Java](../../dev/java/Сравнение%20константы%20слева%20в%20Java.md) diff --git a/meta/zero/00 Криптография.md b/meta/zero/00 Криптография.md index c345ea30..c874f73b 100644 --- a/meta/zero/00 Криптография.md +++ b/meta/zero/00 Криптография.md @@ -6,4 +6,5 @@ date: parents: title: Криптография --- +- [[../../dev/cryptography/Криптографическая хеш-функция|Криптографическая хеш-функция]] - [Генерация аппаратного SSH ключа](../../dev/cryptography/Генерация%20аппаратного%20SSH%20ключа.md) \ No newline at end of file diff --git a/meta/zero/00 Продуктивность.md b/meta/zero/00 Продуктивность.md index f40bb503..ba5c1bc1 100644 --- a/meta/zero/00 Продуктивность.md +++ b/meta/zero/00 Продуктивность.md @@ -5,15 +5,14 @@ title: Продуктивность linked: zero-link: --- -Будучи недовольны своей продуктивностью, первым делом мы задумываемся о том, где взять больше времени. Первое, что приходит на ум,— «тайм-менеджмент», или управление временем. К сожалению, мы редко принимаем во внимание прочие [ресурсы](Ресурсы%20человека.md), необходимые для решения задач. - -Чтобы быть действительно продуктивным, необходимо сначала научиться работать с теми [ресурсами](../../../../knowledge/human/Ресурсы%20человека.md), что у вас есть: +Будучи недовольны своей продуктивностью, первым делом мы задумываемся о том, где взять больше времени. Первое, что приходит на ум,— «тайм-менеджмент», или управление временем. К сожалению, мы редко принимаем во внимание прочие [ресурсы](Ресурсы%20человека.md), необходимые для решения задач: - [Мыслетопливо](../../../../knowledge/human/ресурсы/Мыслетопливо.md) - [Планирование](../../../../knowledge/human/ресурсы/Планирование.md) - [Мотивация](../../../../knowledge/human/other/Мотивация.md) / [Сила воли](../../../../knowledge/human/ресурсы/Сила%20воли.md) - [Внимание](../../../../knowledge/human/Внимание%20человека.md) -Конечно, нередко нам кажется, что заканчивается именно время, но на поверку это оказывается следствием опустошения бачка с [мыслетопливом](Мыслетопливо.md): сначала иссякает оно, потом вырубается [медленное мышление](Мышление%20по%20Даниэлю%20Канеману.md), как результат мы начинаем «тупить» и испытывать затруднения даже с элементарными вещами, делая их во много раз дольше обычного. +Чтобы быть действительно продуктивным, необходимо научиться работать со всеми [ресурсами](../../../../knowledge/human/Ресурсы%20человека.md), что у вас есть: нужно научиться не расходывать их впустую, а также эффективно восстанавливать. ## Заметки +- Конечно, нередко нам кажется, что заканчивается именно время, но на поверку это оказывается следствием опустошения бачка с [мыслетопливом](Мыслетопливо.md): сначала иссякает оно, потом вырубается [медленное мышление](Мышление%20по%20Даниэлю%20Канеману.md), как результат мы начинаем «тупить» и испытывать затруднения даже с элементарными вещами, делая их во много раз дольше обычного. - Продуктивность не равняется времени потраченному на выполнение работы. Вы можете много работать и одновременно над несколькими задачами, но при этом быть контр-продуктивным. - [Бракованный день](../../productivity/Бракованный%20день.md) \ No newline at end of file diff --git a/meta/zero/00 Снипеты для Java.md b/meta/zero/00 Снипеты для Java.md index 34e226cd..9547f119 100644 --- a/meta/zero/00 Снипеты для Java.md +++ b/meta/zero/00 Снипеты для Java.md @@ -15,4 +15,8 @@ aliases: - [Дебаг приложения на этапе компиляции IntelliJ IDEA](../../dev/snippet/Дебаг%20приложения%20на%20этапе%20компиляции%20IntelliJ%20IDEA.md) - [Логирование SQL в Hibernate](../../dev/java/hibernate/Логирование%20SQL%20в%20Hibernate.md) - [Бинарный поиск на Java](../../dev/java/Бинарный%20поиск%20на%20Java.md) -- [[../../dev/snippet/Проблема с Hibernate Reactive в Telegram SDK для Java|Проблема с Hibernate Reactive в Telegram SDK для Java]] \ No newline at end of file +- [[../../dev/snippet/Проблема с Hibernate Reactive в Telegram SDK для Java|Проблема с Hibernate Reactive в Telegram SDK для Java]] +- [[../../dev/snippet/Реализация SHA-256 на Java|Реализация SHA-256 на Java]] +- [[../../../../_inbox/Реализация GZIP в Java|Реализация GZIP в Java]] +- [[../../dev/snippet/Реализация Base64 на Java|Реализация Base64 на Java]] +- [[../../../../_inbox/Преобразование Json из коллекции в Java объект при помощи Jackson|Преобразование Json из коллекции в Java объект при помощи Jackson]] \ No newline at end of file