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

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

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

Начать курс

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

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

Встроенный модуль crypto и библиотеки

Node.js предоставляет встроенный модуль crypto, который полностью совместим с TypeScript. Для браузерных приложений используется Web Crypto API. Для более сложных задач рекомендуется библиотека crypto-js, которая работает как в Node.js, так и в браузере.

Установка необходимых пакетов:

npm install crypto-js
npm install @types/crypto-js --save-dev

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

Алгоритм AES (Advanced Encryption Standard) — наиболее популярный симметричный шифр. Он использует один и тот же ключ для шифрования и расшифровки данных.

Пример реализации AES-256 в TypeScript:

import CryptoJS from 'crypto-js';

const SECRET_KEY = 'my-strong-secret-key-32chars';

function encryptAES(text: string): string {
    const encrypted = CryptoJS.AES.encrypt(text, SECRET_KEY);
    return encrypted.toString();
}

function decryptAES(ciphertext: string): string {
    const decrypted = CryptoJS.AES.decrypt(ciphertext, SECRET_KEY);
    return decrypted.toString(CryptoJS.enc.Utf8);
}

// Использование
const originalText = 'Секретные данные для защиты';
const encrypted = encryptAES(originalText);
console.log('Зашифровано:', encrypted);

const decrypted = decryptAES(encrypted);
console.log('Расшифровано:', decrypted);

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

RSA использует пару ключей: открытый (public) и закрытый (private). Открытым ключом шифруют данные, а закрытым — расшифровывают. Это идеально для безопасной передачи данных.

Пример с использованием Node.js crypto:

import * as crypto from 'crypto';

function generateRSAKeys(): { publicKey: string; privateKey: string } {
    const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
        modulusLength: 2048,
        publicKeyEncoding: { type: 'spki', format: 'pem' },
        privateKeyEncoding: { type: 'pkcs8', format: 'pem' }
    });
    return { publicKey, privateKey };
}

function encryptRSA(plainText: string, publicKey: string): string {
    const buffer = Buffer.from(plainText, 'utf-8');
    const encrypted = crypto.publicEncrypt(publicKey, buffer);
    return encrypted.toString('base64');
}

function decryptRSA(cipherText: string, privateKey: string): string {
    const buffer = Buffer.from(cipherText, 'base64');
    const decrypted = crypto.privateDecrypt(privateKey, buffer);
    return decrypted.toString('utf-8');
}

// Пример использования
const keys = generateRSAKeys();
const message = 'Конфиденциальное сообщение';
const encryptedRSA = encryptRSA(message, keys.publicKey);
const decryptedRSA = decryptRSA(encryptedRSA, keys.privateKey);

console.log('Исходное:', message);
console.log('Расшифрованное:', decryptedRSA);

Хеширование данных

Хеширование — это одностороннее преобразование данных в строку фиксированной длины. В отличие от шифрования, хеш невозможно обратить. Основные применения:

  • Хранение паролей — вместо пароля хранится его хеш
  • Проверка целостности данных — сравнение хешей файлов
  • Цифровые подписи — подтверждение авторства

SHA-256

Наиболее распространённый алгоритм семейства SHA-2:

import CryptoJS from 'crypto-js';

function hashSHA256(data: string): string {
    return CryptoJS.SHA256(data).toString();
}

// Пример
const password = 'myPassword123';
const hashedPassword = hashSHA256(password);
console.log('Хеш SHA-256:', hashedPassword);

HMAC (Hash-based Message Authentication Code)

HMAC добавляет секретный ключ к хешированию, что защищает от подделки данных:

function createHMAC(data: string, secret: string): string {
    return CryptoJS.HmacSHA256(data, secret).toString();
}

function verifyHMAC(data: string, secret: string, hmac: string): boolean {
    const computedHmac = createHMAC(data, secret);
    return computedHmac === hmac;
}

// Использование
const secretKey = 'super-secret-key';
const message = 'Важные данные';
const hmac = createHMAC(message, secretKey);
const isValid = verifyHMAC(message, secretKey, hmac);

console.log('HMAC:', hmac);
console.log('Валидность:', isValid); // true

Безопас

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