# Криптография на практике

← [Раздел](README.md) · [Главная](../README.md)

## Цель

Понять **криптографию без математики PhD**: симметричное/асимметричное шифрование, hashing, TLS, сертификаты — что вы **реально настраиваете** как DevSecOps.

## Предварительно

- [AuthN и AuthZ](authn-authz.md)

## Время

**4–5 часов**

---

## Зачем криптография

| Задача | Механизм |
|--------|----------|
| Secrecy (C) | Encryption |
| Integrity | Hash, MAC, signatures |
| Authenticity | Signatures, TLS certs |
| Password storage | Slow hash (bcrypt) |

**Золотое правило:** не изобретайте свой crypto. Используйте **проверенные библиотеки** и protocols.

---

## Симметричное шифрование

**Один ключ** шифрует и расшифровывает.

| Алгоритм | Статус |
|----------|--------|
| AES-256-GCM | ✅ Modern standard |
| DES, 3DES | ❌ Deprecated |
| «XOR с password» | ❌ Нет |

**Use case:** шифрование диска, TLS session keys, database TDE.

**Проблема:** как передать ключ собеседнику? → **асимметрия** или **TLS handshake**.

---

## Асимметричное шифрование

**Пара ключей:** public (шифровать/verify) + private (расшифровать/sign).

| Use | Кто |
|-----|-----|
| TLS server cert | Public in browser trust store |
| SSH host key | Client verifies fingerprint |
| Code signing | Private key у release pipeline |

**RSA, ECDSA** — common. Key length matters (RSA ≥2048).

---

## Hashing — односторонняя функция

```
password → hash → stored
login input → hash → compare
```

| | Hash (SHA-256) | Password hash (bcrypt) |
|---|----------------|------------------------|
| Speed | Быстро | **Медленно** (on purpose) |
| Use | Integrity checksum | Credentials |
| Salt | Optional | **Required** |

**Не** используйте SHA-256 alone для паролей — GPU ломает быстро.

---

## MAC и digital signatures

| | HMAC | Digital signature |
|---|------|-------------------|
| Ключ | Shared secret | Private key |
| Use | API webhook verify | JWT, binaries |

JWT signed with HS256 (secret) vs RS256 (key pair) — tradeoffs for microservices.

---

## TLS / HTTPS

**TLS** защищает канал: confidentiality + integrity между client и server.

```
Client ──ClientHello──► Server
       ◄──Certificate── Server (signed by CA)
       ──Key exchange──►
       ═ Encrypted data ═
```

| Компонент | Роль |
|-----------|------|
| Certificate | Публичный ключ + identity (CN/SAN) |
| CA | Подписывает cert (Let's Encrypt, DigiCert) |
| Chain | Root → Intermediate → Leaf |

**DevSecOps checks:** expiry alerts, TLS 1.0/1.1 disabled, weak ciphers, cert mismatch.

---

## Let's Encrypt и автоматизация

**ACME** protocol — cert-manager в K8s, certbot на VM.

Renew **до** expiry (90 days LE). Monitor `#days_to_expiry`.

---

## Secrets management

| ❌ | ✅ |
|----|-----|
| `.env` in Git | Vault, AWS Secrets Manager |
| Same key all envs | Per-env rotation |
| Env in Docker image | Runtime injection |

**Envelope encryption:** data key encrypts data, KMS key encrypts data key.

---

## Encryption at rest vs in transit

| | In transit | At rest |
|---|------------|---------|
| Где | Network | Disk, DB, backup |
| Как | TLS | AES disk, DB TDE |
| DevSecOps | cert scan | Cloud default + verify |

Оба нужны. HTTPS **не** шифрует данные на диске БД.

---

## mTLS (mutual TLS)

**Обе стороны** предъявляют сертификат. Service mesh (Istio, Linkerd) — common pattern.

---

## Что проверять в audit

- [ ] TLS on all public endpoints
- [ ] HSTS header (осторожно с rollback)
- [ ] Passwords hashed bcrypt/Argon2
- [ ] No MD5/SHA1 for security purposes
- [ ] Keys in KMS, rotation documented
- [ ] Backup encryption enabled

---

## Практика

1. `openssl s_client -connect example.com:443 -servername example.com` — посмотреть cert chain (read-only).
2. Local HTTPS с **mkcert** для lab domain.
3. Сгенерируйте bcrypt hash (`htpasswd -B` или online **lab tool**) — сравните с plain SHA256 length.
4. Найдите в K8s ingress annotation для TLS secret name.

---

## Самопроверка

1. Чем symmetric отличается от asymmetric — аналогия?
2. Зачем bcrypt «медленный»?
3. Что проверяет browser при HTTPS?
4. HTTPS защищает данные на сервере после расшифровки?

---

## Дальше

→ [05 — Secure SDLC](../05-secure-sdlc/README.md)

Или вернитесь к [главной странице курса](../README.md).
