Криптография в TypeScript: шифрование и хеширование

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Криптография в TypeScript: шифрование и хеширование

Современная веб-разработка немыслима без обеспечения безопасности данных. TypeScript, как строго типизированная надстройка над JavaScript, предоставляет разработчикам мощные инструменты для реализации криптографических алгоритмов. В этой статье мы рассмотрим основные методы шифрования и хеширования, доступные в экосистеме TypeScript, и покажем, как их применять на практике.

Почему криптография важна в TypeScript?

TypeScript широко используется как для фронтенда, так и для бэкенда (через Node.js). В обоих случаях возникает необходимость защищать конфиденциальные данные: пароли пользователей, токены аутентификации, содержимое сообщений. Без proper криптографической защиты данные могут быть перехвачены или скомпрометированы.

Криптография в TypeScript решает три основные задачи:

  • Конфиденциальность — шифрование данных, чтобы их не могли прочитать посторонние.
  • Целостность — гарантия того, что данные не были изменены при передаче.
  • Аутентификация — проверка подлинности источника данных.

Основные криптографические библиотеки для TypeScript

В TypeScript можно использовать как встроенные API браузера, так и сторонние библиотеки. Рассмотрим наиболее популярные варианты:

1. Web Crypto API (встроенный в браузер)

Стандартный API, доступный в современных браузерах и Node.js (с версии 15). Не требует установки дополнительных пакетов. Поддерживает AES, RSA, SHA и многое другое.

2. crypto (библиотека Node.js)

Встроенный модуль Node.js, предоставляющий широкий набор криптографических функций. Для TypeScript требуется установка типов: npm install @types/node.

3. bcrypt / bcryptjs

Специализированная библиотека для хеширования паролей. Рекомендуется для хранения пользовательских паролей благодаря встроенной солевой защите.

4. tweetnacl / nacl

Библиотека для шифрования с открытым ключом (NaCl). Отличается высокой производительностью и простотой использования.

Шифрование данных в TypeScript

Рассмотрим два основных типа шифрования: симметричное (один ключ) и асимметричное (пара ключей).

Симметричное шифрование с AES-GCM

AES (Advanced Encryption Standard) в режиме GCM обеспечивает как шифрование, так и проверку целостности данных. Пример реализации на TypeScript с использованием Web Crypto API:

// Функция шифрования AES-GCM
async function encryptAESGCM(
  plaintext: string,
  password: string
): Promise<{ iv: Uint8Array; ciphertext: Uint8Array }> {
  const encoder = new TextEncoder();
  const keyMaterial = await crypto.subtle.importKey(
    'raw',
    encoder.encode(password),
    'PBKDF2',
    false,
    ['deriveBits', 'deriveKey']
  );

  const key = await crypto.subtle.deriveKey(
    {
      name: 'PBKDF2',
      salt: encoder.encode('my-salt'),
      iterations: 100000,
      hash: 'SHA-256',
    },
    keyMaterial,
    { name: 'AES-GCM', length: 256 },
    false,
    ['encrypt']
  );

  const iv = crypto.getRandomValues(new Uint8Array(12));
  const encrypted = await crypto.subtle.encrypt(
    { name: 'AES-GCM', iv },
    key,
    encoder.encode(plaintext)
  );

  return {
    iv,
    ciphertext: new Uint8Array(encrypted),
  };
}

// Пример использования
const { iv, ciphertext } = await encryptAESGCM('Секретное сообщение', 'мой-пароль');
console.log('Зашифрованные данные:', ciphertext);

Асимметричное шифрование с RSA-OAEP

RSA использует пару ключей: открытый для шифрования и закрытый для расшифровки. Пример генерации ключей и шифрования:

// Генерация пары ключей RSA
async function generateRSAKeyPair(): Promise<CryptoKeyPair> {
  return await crypto.subtle.generateKey(
    {
      name: 'RSA-OAEP',
      modulusLength: 2048,
      publicExponent: new Uint8Array([1, 0, 1]),
      hash: 'SHA-256',
    },
    true,
    ['encrypt', 'decrypt']
  );
}

// Шифрование с открытым ключом
async function encryptRSA(
  plaintext: string,
  publicKey: CryptoKey
): Promise<ArrayBuffer> {
  const encoder = new TextEncoder();
  return await crypto.subtle.encrypt(
    { name: 'RSA-OAEP' },
    publicKey,
    encoder.encode(plaintext)
  );
}

// Пример: генерируем ключи и шифруем
const keyPair = await generateRSAKeyPair();
const encrypted = await encryptRSA('Кон                    

Рекомендаций