Три різні задачі, які часто плутають:
Хешування - одностороннє перетворення даних у відбиток фіксованої довжини. Відновити дані з хешу неможливо.
- Перевірка цілісності: чи не змінився файл (SHA-256).
- Паролі - але лише повільними функціями з сіллю (Argon2id, bcrypt), не швидкими.
Шифрування - двостороннє: з ключем дані можна розшифрувати.
- Симетричне (AES-GCM, ChaCha20-Poly1305): один ключ шифрує й розшифровує. Швидке; для даних у базі, файлів, cookie.
- Асиметричне (RSA, X25519): публічний ключ шифрує, лише приватний розшифровує. Для обміну ключами й шифрування для конкретного отримувача.
Використовують автентифіковане шифрування (AEAD): воно не лише приховує дані, а й виявляє їхню зміну. Шифрування без перевірки цілісності (AES-CBC без MAC) вразливе до підміни шифротексту.
Підпис / MAC - доводить, що дані не змінено і створено тим, хто має ключ. Дані при цьому лишаються відкритими.
- HMAC (симетричний): спільний секрет - підписані URL, підписи вебхуків, JWT з HS256.
- Цифровий підпис (Ed25519, ECDSA, RSA): приватний ключ підписує, будь-хто з публічним - перевіряє. JWT з RS256/EdDSA, підписи релізів, TLS-сертифікати.
У Laravel:
Crypt::encryptString($iban); // AES-256-CBC + HMAC (або GCM): шифрування з перевіркою цілісності
Hash::make($password); // повільний хеш пароля
URL::signedRoute('unsubscribe', ['user' => $id]); // HMAC-підпис
Головні правила: не винаходити власну криптографію, використовувати перевірені бібліотеки (libsodium, вбудовані засоби фреймворку), зберігати ключі окремо від даних і мати план ротації ключів.