Криптография в 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('Кон Также в библиотеке
Авторизация и аутентификация в Go: пакеты и практические примеры
TypeStack/class-validator для TypeScript: полное руководство с примерами
Elasticsearch REST клиент для Kotlin: руководство по использованию
Криптография в TypeScript: Обзор библиотеки crypto-js
Работа с Excel в C# (.NET): библиотеки EPPlus, ClosedXML и NPOI