Для чего нужна Асимметричная криптография?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Асимметричная криптография в веб-разработке
Основное назначение
Асимметричная криптография (или криптография с открытым ключом) — это система шифрования, где используются два разных ключа: открытый (public key) и закрытый (private key). Открытый ключ может быть известен всем, а закрытый ключ хранится в секрете. Это решает главную проблему симметричной криптографии — как безопасно обмениваться ключами через открытый канал.
Как это работает
// Концептуально (реальная реализация сложнее):
// Алиса генерирует пару ключей
const aliceKeyPair = generateKeyPair();
const alicePublicKey = aliceKeyPair.publicKey;
const alicePrivateKey = aliceKeyPair.privateKey;
// Алиса делится своим ОТКРЫТЫМ ключом с Бобом
// (публикует его, отправляет в письме и т.д.)
// Боб шифрует сообщение открытым ключом Алисы
const message = "Привет, Алиса!";
const encrypted = encrypt(message, alicePublicKey);
// Отправляет зашифрованное сообщение Алисе
// Даже если кто-то перехватит — не сможет расшифровать
// Алиса расшифровывает сообщение своим ЗАКРЫТЫМ ключом
const decrypted = decrypt(encrypted, alicePrivateKey);
console.log(decrypted); // "Привет, Алиса!"
Основные свойства
1. Шифрование (Confidentiality)
То, что зашифровано открытым ключом, может быть расшифровано только закрытым ключом:
- Боб может отправить Алисе сообщение, зашифрованное её открытым ключом
- Только Алиса (у которой есть закрытый ключ) может прочитать
- Даже Боб не может расшифровать свои же сообщение!
2. Цифровая подпись (Authentication)
Закрытый ключ может создавать подпись, открытый — проверять:
// Алиса подписывает сообщение закрытым ключом
const message = "Я согласна с контрактом";
const signature = sign(message, alicePrivateKey);
// Боб получает сообщение и подпись
// Проверяет подпись открытым ключом Алисы
const isValid = verify(message, signature, alicePublicKey);
if (isValid) {
console.log("Подпись подтверждает, что это действительно Алиса");
}
Основные использования в веб-разработке
1. HTTPS и TLS сертификаты
Это ГЛАВНОЕ применение асимметричной криптографии:
Когда вы заходите на https://google.com:
1. Браузер получает сертификат сервера (содержит открытый ключ Google)
2. Браузер проверяет подпись сертификата (Certificate Authority подписала его)
3. Браузер и сервер договариваются об общем ключе (обмен Диффи-Хеллмана)
4. Дальше используется симметричная криптография (быстрее)
5. Закрытый ключ Google никогда не отправляется
Без асимметричной криптографии вы не смогли бы безопасно обменяться ключами с сервером!
2. JWT токены (цифровая подпись)
В аутентификации часто используются JWT с асимметричной подписью:
// На Backend (секретно)
const privateKey = fs.readFileSync("private.key");
const token = jwt.sign(
{ userId: 123, email: "user@example.com" },
privateKey,
{ algorithm: "RS256" } // RSA подпись
);
// На Frontend (или другом сервисе)
const publicKey = fs.readFileSync("public.key");
const decoded = jwt.verify(token, publicKey, {
algorithms: ["RS256"]
});
// Мы УВЕРЕНЫ, что токен создал именно сервер,
// потому что мы проверили его подпись открытым ключом
3. SSH (защита серверов)
Доступ к серверам через SSH использует асимметричную криптографию:
Пользователь генерирует пару ключей:
- ~/.ssh/id_rsa (закрытый ключ — хранится локально, никому не говорим)
- ~/.ssh/id_rsa.pub (открытый ключ — добавляем на сервер)
При подключении:
1. Клиент отправляет свой открытый ключ
2. Сервер генерирует challenge
3. Клиент подписывает challenge закрытым ключом
4. Сервер проверяет подпись открытым ключом
5. Если совпадает — доступ разрешён
Сервер никогда не видит закрытый ключ!
4. API ключи и OAuth
// Frontend получает публичный ключ от сервера
const publicKey = await fetch("/api/public-key").then(r => r.json());
// Шифрует чувствительные данные
const encrypted = await encrypt(sensitiveData, publicKey);
// Отправляет зашифрованные данные
await fetch("/api/secure-endpoint", {
method: "POST",
body: JSON.stringify({ encrypted })
});
// Server расшифровывает закрытым ключом
const decrypted = decrypt(req.body.encrypted, privateKey);
5. Подписание документов и контрактов
const document = "Контракт между сторонами...";
// Компания подписывает документ
const signature = sign(document, companyPrivateKey);
// Клиент может проверить подпись
const isAuthentic = verify(document, signature, companyPublicKey);
if (isAuthentic) {
console.log("Документ не изменён и подписан компанией");
}
Асимметричная криптография vs Симметричная
// СИММЕТРИЧНАЯ: один ключ для шифрования и расшифрования
const key = generateSecretKey();
const encrypted = encryptSymmetric(message, key);
const decrypted = decryptSymmetric(encrypted, key);
// Проблема: как безопасно передать ключ?
// АСИММЕТРИЧНАЯ: разные ключи
const { publicKey, privateKey } = generateKeyPair();
const encrypted = encryptAsymmetric(message, publicKey);
const decrypted = decryptAsymmetric(encrypted, privateKey);
// Решение: публичный ключ можно делиться со всеми!
Основные алгоритмы
// RSA — самый популярный
const algo = "RSA";
// ECDSA — более современный и эффективный
const algo = "ECDSA";
// EdDSA — новый стандарт (Ed25519)
const algo = "EdDSA";
// В крипто на Frontend часто используется:
import nacl from "tweetnacl";
const keyPair = nacl.box.keyPair(); // Curve25519
Практический пример в Node.js
const crypto = require("crypto");
// Генерируем пару ключей
const { publicKey, privateKey } = crypto.generateKeyPairSync("rsa", {
modulusLength: 2048,
publicExponent: 0x10001
});
// Шифруем
const plaintext = "Секретное сообщение";
const encrypted = crypto.publicEncrypt(publicKey, Buffer.from(plaintext));
// Расшифровываем
const decrypted = crypto.privateDecrypt(
privateKey,
encrypted
).toString();
console.log(decrypted); // "Секретное сообщение"
// Подписываем
const signature = crypto.sign("sha256", Buffer.from(plaintext), privateKey);
// Проверяем подпись
const isValid = crypto.verify(
"sha256",
Buffer.from(plaintext),
publicKey,
signature
);
Почему это важно для Frontend разработчика
- HTTPS — асимметричная криптография защищает ваше соединение с сервером
- JWT подпись — вы проверяете, что токен подписан именно вашим сервером
- OAuth и OpenID Connect — используют асимметричные ключи для безопасной аутентификации
- Безопасность данных — понимание крипто помогает правильно проектировать API
- Интервью — вопросы по криптографии часто встречаются
Вывод
Асимметричная криптография решает главную задачу веб-безопасности: как безопасно общаться с кем-то, не имея общего секрета заранее. Открытый и закрытый ключи позволяют:
- Шифровать данные (только держатель закрытого ключа может расшифровать)
- Подписывать данные (доказать авторство)
- Аутентифицировать (убедиться в идентичности)
Именно благодаря асимметричной криптографии HTTPS и современный интернет вообще работают безопасно.