Ответ
Асимметричное шифрование (или криптография с открытым ключом) — это система, использующая пару ключей для шифрования данных: публичный и приватный.
- Публичный ключ можно свободно распространять. Он используется для шифрования данных и проверки цифровой подписи.
- Приватный ключ должен храниться в секрете. Он используется для расшифровки данных, зашифрованных публичным ключом, и для создания цифровой подписи.
Главный принцип: данные, зашифрованные одним ключом из пары, могут быть расшифрованы только другим ключом из этой же пары.
Применение в бэкенде:
- HTTPS/TLS: Установка безопасного соединения, когда сервер предоставляет свой публичный ключ клиенту.
- SSH: Аутентификация пользователей по ключам.
- JWT (JWS): Подпись токенов для подтверждения их подлинности.
Пример на Go (RSA-OAEP):
import (
"crypto/rand",
"crypto/rsa",
"crypto/sha256",
"fmt"
)
func main() {
// 1. Генерация пары ключей
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
panic(err)
}
publicKey := &privateKey.PublicKey
message := []byte("очень секретное сообщение")
// 2. Шифрование с помощью публичного ключа
ciphertext, err := rsa.EncryptOAEP(
sha256.New(),
rand.Reader,
publicKey,
message,
nil,
)
if err != nil {
panic(err)
}
// 3. Расшифровка с помощью приватного ключа
plaintext, err := rsa.DecryptOAEP(
sha256.New(),
rand.Reader,
privateKey,
ciphertext,
nil,
)
if err != nil {
panic(err)
}
fmt.Printf("Original: %sn", string(message))
fmt.Printf("Decrypted: %sn", string(plaintext))
}
Преимущества:
- Безопасный обмен ключами: Нет необходимости передавать секретный ключ по незащищенному каналу.
Недостатки:
- Низкая производительность: Значительно медленнее (в сотни и тысячи раз), чем симметричное шифрование, из-за сложных математических вычислений.