# Хук crypto: обнаружение слабой криптографии

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

Канонический URL: https://lagune.ai/ru-RU/docs/hooks/crypto
Язык: ru-RU
Оригинал: https://lagune.ai/docs/hooks/crypto
Последнее обновление: 2026-11-03

Хук `crypto` помечает **слабые криптографические примитивы** в месте вызова: устаревший шифр, небезопасный режим или взломанную хеш-функцию. Он **учитывает язык** и читает каждый файл по его собственным правилам, поэтому конструкция Python никогда не помечается в файле Rust. Это детерминированный движок, стоящий за [специализацией `crypto`](https://lagune.ai/ru-RU/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/ru-RU/docs/catalog).

## Частые вопросы

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

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

### Помечает ли хук crypto Math.random()?

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