← Назад к вопросам

Для чего нужна Асимметричная криптография?

2.0 Middle🔥 181 комментариев
#Soft Skills и рабочие процессы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Асимметричная криптография в веб-разработке

Основное назначение

Асимметричная криптография (или криптография с открытым ключом) — это система шифрования, где используются два разных ключа: открытый (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 разработчика

  1. HTTPS — асимметричная криптография защищает ваше соединение с сервером
  2. JWT подпись — вы проверяете, что токен подписан именно вашим сервером
  3. OAuth и OpenID Connect — используют асимметричные ключи для безопасной аутентификации
  4. Безопасность данных — понимание крипто помогает правильно проектировать API
  5. Интервью — вопросы по криптографии часто встречаются

Вывод

Асимметричная криптография решает главную задачу веб-безопасности: как безопасно общаться с кем-то, не имея общего секрета заранее. Открытый и закрытый ключи позволяют:

  • Шифровать данные (только держатель закрытого ключа может расшифровать)
  • Подписывать данные (доказать авторство)
  • Аутентифицировать (убедиться в идентичности)

Именно благодаря асимметричной криптографии HTTPS и современный интернет вообще работают безопасно.

Для чего нужна Асимметричная криптография? | PrepBro