From 9fe12c4ab756a3f7f53ee2937ccb09ee484ff21c Mon Sep 17 00:00:00 2001 From: erjemin Date: Wed, 15 Jul 2026 21:41:51 +0300 Subject: [PATCH] =?UTF-8?q?doc:=20=D0=9A=D0=B0=D0=BA=20=D1=81=D0=BE=D0=B7?= =?UTF-8?q?=D0=B4=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=B8=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=BA=20=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D1=8F=D1=82=D1=8C?= =?UTF-8?q?=20offer=5Fcode=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BA=D1=80=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D1=8F=20ID=20=D0=B2=20URL=20=D0=B8=20QR-=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OFFER-CODE-HASHIDS-SALT-GENERATION.md | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 agent-reports/OFFER-CODE-HASHIDS-SALT-GENERATION.md diff --git a/agent-reports/OFFER-CODE-HASHIDS-SALT-GENERATION.md b/agent-reports/OFFER-CODE-HASHIDS-SALT-GENERATION.md new file mode 100644 index 0000000..608b196 --- /dev/null +++ b/agent-reports/OFFER-CODE-HASHIDS-SALT-GENERATION.md @@ -0,0 +1,112 @@ +# Генерирование криптографической соли для OFFER_HASHIDS_SALT + +## Для Development (локально) + +Текущее значение в `.env`. Если база из dev будет перемещаться в продакшен, то соль не нужно будет заменять +на уникальную для продакшена. А то все старые QR-коды перестанут работать. + +Возможно TODO сделать Django Custom Command для генерации соли и обновления `.env` автоматически. + +``` + +## Для Production (сервер) + +**НИКОГДА** не используйте соль из примеров! Генерируйте новую для каждого окружения: + +### Способ 1: Python (быстро) +```bash +python3 -c "import secrets; print(secrets.token_hex(16))" +``` + +Результат: +``` +a7f3c82b9e1d4a6b5c8f2e3d0a9b4c7f +``` + +Скопируйте и обновите в `.env` на сервере: +``` +OFFER_HASHIDS_SALT=a7f3c82b9e1d4a6b5c8f2e3d0a9b4c7f +``` + +### Способ 2: Linux/Mac (встроенный) +```bash +openssl rand -hex 16 +``` + +### Способ 3: Более надежная соль (32 байта вместо 16) +```bash +python3 -c "import secrets; print(secrets.token_hex(32))" +``` + +Результат (64 символа, очень стойко): +``` +a7f3c82b9e1d4a6b5c8f2e3d0a9b4c7fa7f3c82b9e1d4a6b5c8f2e3d0a9b4c +``` + +## Важные правила + +1. **Уникальная для каждого окружения** (каждой реализации LPON под каждого сейлера) + - Dev ≠ Staging ≠ Production + - Разные соли = разные коды для одного ID + +2. **Никогда не меняйте в production!** + - Если поменяете соль → старые коды перестанут работать (если будет создана Django Custom Command для перегенерации + s_offer_code под новую "соль", то сделать перегенерацию обязательно) + - Существующие QR-коды станут невалидными + - Существующие ID в базе не будут декодироваться + +3. **Хранить в .env (не в репозитории)** + - `.env` в .gitignore ✓ + - `.env.example` содержит шаблон ✓ + +## Проверка качества соли + +```python +import secrets + +# Хорошая соль (минимум 32 символа, hex-формат) +salt = secrets.token_hex(16) # ✓ +salt = secrets.token_hex(32) # ✓✓ еще лучше + +# Плохие соли +salt = "my-password" # ✗ слишком короткая +salt = "12345678" # ✗ предсказуемая +salt = "qwerty123" # ✗ слабая энтропия +``` + +## Параметры OFFER_HASHIDS_MIN_LENGTH + +| Кол-во оферов | min_length | Пример | Примечание | +|---------------|------------|--------------|---------------------------------------| +| До 1 000 | 4 | `a1bC` | Слишком короткие, может быть коллизии | +| До 10 000 | 5 | `a1bCd` | Хорошо для небольших каталогов | +| До 100 000 | 6 | `a1bCdE` | **РЕКОМЕНДУЕМО** для начала | +| До 1 000 000 | 8 | `a1bCdEfG` | Для больших каталогов | +| Более 1M | 10 | `a1bCdEfGhI` | Очень большие каталоги | + +**Текущее значение:** `OFFER_HASHIDS_MIN_LENGTH=6` (оптимально) + +## Как увеличить при необходимости? + +Если вырос каталог: + +1. Обновите в `.env`: + ``` + OFFER_HASHIDS_MIN_LENGTH=8 + ``` + +2. Перезагрузите приложение + +3. **Старые коды останутся валидными!** (hashids декодирует любой код независимо от min_length) + +4. Новые офферы будут кодироваться с длиной 8 + +## Итого + +✓ Текущая соль: `4ce44e07053ac50e1096d6725a4782ac` (dev) +✓ Текущая длина: `6` (оптимальна) +✓ Для production: **Генерируйте новую соль** + +```bash +python3 -c "import secrets; print(secrets.token_hex(16))" +```