# Хук crypto: виявлення слабкої криптографії

> Перевірте кодову базу на слабкі криптографічні примітиви або оцініть окремий фрагмент коду просто з командного рядка.

Канонічна URL-адреса: https://lagune.ai/uk-UA/docs/hooks/crypto
Мова: uk-UA
Оригінал: https://lagune.ai/docs/hooks/crypto
Останнє оновлення: 2026-11-03

Хук `crypto` позначає **слабкі криптографічні примітиви** в місці виклику: застарілий шифр, небезпечний режим або зламаний геш. Він **враховує мову** й читає кожен файл за його власними правилами, тож конструкцію Python ніколи не буде позначено у файлі Rust. Це детермінований рушій [спеціалізації `crypto`](https://lagune.ai/uk-UA/docs/catalog), який ви можете запускати самі в режимі **scan** або **check**.

## Запуск

**Перевірити кодову базу**

```bash
npx lagune read crypto                # scans the whole project
npx lagune read crypto --dir src      # scans a directory
npx lagune read crypto --file hash.ts # scans a single file
```

**Перевірити фрагмент**

```bash
npx lagune read crypto --lang javascript --pattern 'createCipher("aes-256-cbc", k)' # => weak
npx lagune read crypto --lang python --pattern 'hashlib.md5(data)'                  # => review
npx lagune read crypto --lang go --pattern 'sha256.Sum256(data)'                    # => safe
```

Перевірка виводить до двох розділів. **Weak cryptography found** є набором знахідок (DES/3DES/RC4/Blowfish/RC2, режим ECB): кожна з них є зламаним шифрувальним примітивом, тож хук завершується з ненульовим кодом. **Cryptography to review manually** є набором зачіпок, які хук не може оцінити сам: геш MD5/SHA-1 (зламаний для потреб безпеки, але цілком доречний як звичайна контрольна сума, тож усе вирішує намір), некриптографічний генератор випадкових чисел у контексті безпеки або порівняння, вразливе до атак за часом. Чистий запуск виводить `no weak cryptography found`.

## Як читати вердикт

| Вердикт   | Значення                                                                                                              |
| --------- | --------------------------------------------------------------------------------------------------------------------- |
| `weak`    | Фрагмент використовує зламаний шифрувальний примітив (DES/3DES, RC4, Blowfish, RC2 або режим ECB).                    |
| `review`  | Примітив, що залежить від наміру: геш MD5/SHA-1 або некриптографічний генератор випадкових чисел у контексті безпеки. |
| `safe`    | Фрагмент використовує криптографію, і слабких примітивів не знайдено.                                                 |
| `invalid` | Фрагмент не містить розпізнаваної криптографічної конструкції, яку можна оцінити.                                     |

### Параметри CLI

| Параметр    | Значення      | Опис                                                                                                       |
| ----------- | ------------- | ---------------------------------------------------------------------------------------------------------- |
| `--pattern` | фрагмент коду | Перевірити один фрагмент. Повторіть, щоб перевірити кілька, по вердикту на рядок.                          |
| `--lang`    | мова          | Обов'язковий із `--pattern`: одна з javascript, python, go, java, kotlin, php, ruby, rust, csharp, c, cpp. |
| `--dir`     | каталог       | Обмежити перевірку каталогом. Повторюється й поєднується з `--file`.                                       |
| `--file`    | файл          | Обмежити перевірку одним файлом. Повторюється й поєднується з `--dir`.                                     |

Без параметрів хук перевіряє весь проєкт. `--pattern` потребує `--lang` і не поєднується з `--dir` чи `--file`.

### Підтримувані мови

Перевірка читає ці мови, визначаючи їх за розширенням файлу, і звіряє кожну з її власними криптографічними API.

| Мова                        | Слабкі шифри (знахідка) і геші та генератори випадкових чисел (перегляд)                                      |
| --------------------------- | ------------------------------------------------------------------------------------------------------------- |
| **JavaScript / TypeScript** | `createCipher`, `CryptoJS.DES/RC4`, `*-ecb` у лапках; MD5/SHA-1 `createHash`/`subtle.digest`; `Math.random()` |
| **Python**                  | pycryptodome `DES/ARC4/Blowfish.new`, `algorithms.TripleDES`, `MODE_ECB`; `hashlib.md5/sha1`; `random.*`      |
| **Go**                      | `des.NewCipher`, `rc4.NewCipher`, `blowfish.NewCipher`, `NewECBEncrypter`; `md5/sha1.Sum`; `math/rand`        |
| **Java / Kotlin**           | `Cipher.getInstance("DES"/…/ECB")`; `MessageDigest.getInstance("MD5")`, `HmacMD5`; `java.util.Random`         |
| **PHP**                     | `openssl_encrypt("des-…"/"…-ecb")`, `mcrypt_*`; `md5()`/`sha1()`, `hash("md5", …)`; `rand()`/`mt_rand()`      |
| **Ruby**                    | `OpenSSL::Cipher.new("des-…")`, `:ECB`; `Digest::MD5/SHA1`; `rand()`/`Random`                                 |
| **Rust**                    | `Rc4::`, `Blowfish::`, `des::`, `ecb::`; `Md5::`, `Sha1::`, `Hmac<Md5>`; `SmallRng`/`XorShiftRng`             |
| **C#**                      | `DES/TripleDES/RC2.Create`, `CipherMode.ECB`; `MD5/SHA1.Create`, `HMACMD5`; `new Random()`                    |
| **C / C++**                 | OpenSSL `DES_*`/`RC4`/`EVP_des_*`, `EVP_*_ecb`; `MD5()`/`SHA1()`, `EVP_md5`; `rand()`/`random()`              |

**Найкраще з можливого, але не вичерпно**

Хук читає вихідний код як текст, тож примітив, зібраний під час виконання, прихований за псевдонімом або записаний у формі, яку хук не розпізнає, може прослизнути. Сприймайте таблицю як надійну відправну точку, а не як повний перелік.

**Порада**

Хук гарантує мінімум (ці конструкції існують): керування ключами, повторне використання IV і доповнення RSA і далі охоплює [спеціалізація `crypto`](https://lagune.ai/uk-UA/docs/catalog), бо це питання судження.

## Часті запитання

### Як перевірити кодову базу на слабку криптографію?

Запустіть хук crypto без прапорців. Зламані шифри й режим ECB є знахідками, що завершуються з ненульовим кодом. Геш MD5/SHA-1 є зачіпкою для перегляду, бо він зламаний для потреб безпеки, але цілком доречний як звичайна контрольна сума.

### Чи позначає хук crypto Math.random()?

Лише як зачіпку для перегляду в контексті безпеки, а не як автоматичну знахідку, бо випадковість цілком доречна для jitter чи порядку елементів в інтерфейсі.
