Разгледайте Web Crypto API – мощен инструмент за криптографски операции в браузъра. Научете за хеширане, криптиране, подписи и управление на ключове с примери.
Web Crypto API: Цялостно ръководство за криптографски операции
Web Crypto API е JavaScript API, което позволява на разработчиците да извършват криптографски операции директно в браузъра. Това открива възможности за изграждане на сигурни уеб приложения, без да се разчита на обработка от страна на сървъра за чувствителни задачи. Тази статия предоставя цялостен преглед на Web Crypto API, като обхваща неговите ключови функционалности, случаи на употреба и най-добри практики.
Въведение в криптографията в браузъра
Традиционно криптографските операции се извършваха предимно от страна на сървъра поради съображения за сигурност и ограниченията на клиентския JavaScript. Въпреки това, Web Crypto API предоставя сигурен и стандартизиран начин за извършване на криптографски задачи директно в браузъра. Това позволява редица нови функции, като криптиране от страна на клиента, сигурно удостоверяване и цифрови подписи, без излишно предаване на чувствителни данни към сървъра.
Едно голямо предимство на криптографията от страна на клиента е намаленото натоварване на сървъра. Чрез прехвърляне на криптографските изчисления към браузъра, сървърът може да се съсредоточи върху други задачи, подобрявайки общата производителност на приложението. Освен това, криптирането от страна на клиента може да подобри поверителността на потребителите, като гарантира, че чувствителните данни се криптират, преди да напуснат устройството на потребителя.
Основни концепции на Web Crypto API
Web Crypto API се основава на следните основни концепции:
- Криптографски алгоритми: API поддържа различни криптографски алгоритми, включително симетрично криптиране (напр. AES), асиметрично криптиране (напр. RSA), хеширащи алгоритми (напр. SHA-256) и алгоритми за цифрови подписи (напр. ECDSA).
- Ключове: Криптографските операции често изискват ключове. Web Crypto API предоставя механизми за генериране, импортиране, експортиране и сигурно съхранение на ключове. Ключовете могат да бъдат симетрични (използвани както за криптиране, така и за декриптиране) или асиметрични (състоящи се от публичен и частен ключ).
- Интерфейс SubtleCrypto: Интерфейсът
SubtleCryptoе основната входна точка за достъп до криптографските функции. Той предоставя методи за извършване на хеширане, криптиране, декриптиране, подписване и проверка. - Promises (Обещания): Всички криптографски операции в Web Crypto API са асинхронни и връщат promises. Това гарантира, че потребителският интерфейс на браузъра остава отзивчив, докато се извършват потенциално отнемащи време криптографски задачи.
Поддържани криптографски алгоритми
Web Crypto API поддържа широк набор от криптографски алгоритми. Ето някои от най-често използваните:
Симетрично криптиране
- AES (Advanced Encryption Standard): Широко използван симетричен алгоритъм за криптиране. Web Crypto API поддържа режимите AES-CBC, AES-CTR, AES-GCM и AES-KW.
Асиметрично криптиране
- RSA (Rivest-Shamir-Adleman): Популярен асиметричен алгоритъм за криптиране. Web Crypto API поддържа схемите за подпълване RSA-OAEP и RSA-PSS.
- ECDSA (Elliptic Curve Digital Signature Algorithm): Асиметричен алгоритъм за подпис, базиран на криптография с елиптични криви.
- ECDH (Elliptic Curve Diffie-Hellman): Протокол за договаряне на ключове, базиран на криптография с елиптични криви.
Хеширащи алгоритми
- SHA-256 (Secure Hash Algorithm 256-bit): Широко използван хеширащ алгоритъм, който произвежда 256-битова хеш стойност.
- SHA-384 (Secure Hash Algorithm 384-bit): Хеширащ алгоритъм, който произвежда 384-битова хеш стойност.
- SHA-512 (Secure Hash Algorithm 512-bit): Хеширащ алгоритъм, който произвежда 512-битова хеш стойност.
Основни криптографски операции
Нека разгледаме някои основни криптографски операции, като използваме Web Crypto API с примери с код.
Хеширане
Хеширането е процесът на трансформиране на данни в низ от символи с фиксиран размер (хеш стойност). Хеширането се използва за проверки на целостта на данните, съхранение на пароли и индексиране.
async function hashData(data) {
const encoder = new TextEncoder();
const dataBuffer = encoder.encode(data);
const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);
const hashArray = Array.from(new Uint8Array(hashBuffer));
const hashHex = hashArray
.map((b) => b.toString(16).padStart(2, '0'))
.join('');
return hashHex;
}
// Example usage:
hashData('Hello, world!')
.then((hash) => console.log('SHA-256 Hash:', hash))
.catch((err) => console.error('Hashing error:', err));
Генериране на симетрични ключове
Симетричните ключове се използват за криптиране и декриптиране със същия ключ. Web Crypto API ви позволява да генерирате симетрични ключове, като използвате метода generateKey().
async function generateAESKey() {
return await crypto.subtle.generateKey(
{
name: 'AES-GCM',
length: 256,
},
true, // extractable
['encrypt', 'decrypt'] // usages
);
}
// Example usage:
generateAESKey()
.then((key) => {
console.log('AES Key generated:', key);
// Use the key for encryption/decryption
})
.catch((err) => console.error('Key generation error:', err));
Криптиране на данни
Криптирането е процесът на трансформиране на данни в нечетим формат, за да се защити тяхната поверителност. Ето пример за криптиране на данни с AES-GCM:
async function encryptData(key, data) {
const encoder = new TextEncoder();
const dataBuffer = encoder.encode(data);
const iv = crypto.getRandomValues(new Uint8Array(12)); // Initialization vector
const encryptedData = await crypto.subtle.encrypt(
{
name: 'AES-GCM',
iv: iv,
},
key,
dataBuffer
);
// Combine IV and encrypted data for storage/transmission
const combined = new Uint8Array(iv.length + encryptedData.byteLength);
combined.set(iv, 0);
combined.set(new Uint8Array(encryptedData), iv.length);
return combined;
}
// Example usage (assuming you have an AES key):
generateAESKey().then(key => {
encryptData(key, 'Sensitive data')
.then((encrypted) => {
console.log('Encrypted data:', encrypted);
})
.catch((err) => console.error('Encryption error:', err));
});
Декриптиране на данни
Декриптирането е процесът на трансформиране на криптирани данни обратно в техния оригинален, четим формат. Ето пример за декриптиране на данни, криптирани с AES-GCM:
async function decryptData(key, combined) {
const iv = combined.slice(0, 12);
const encryptedData = combined.slice(12);
const decryptedData = await crypto.subtle.decrypt(
{
name: 'AES-GCM',
iv: iv,
},
key,
encryptedData
);
const decoder = new TextDecoder();
return decoder.decode(decryptedData);
}
// Example usage (assuming you have the AES key and encrypted data):
generateAESKey().then(key => {
encryptData(key, 'Sensitive data').then(encrypted => {
decryptData(key, encrypted)
.then((decrypted) => {
console.log('Decrypted data:', decrypted);
})
.catch((err) => console.error('Decryption error:', err));
});
});
Генериране на асиметрични ключове
Асиметричните ключове се състоят от публичен ключ и частен ключ. Публичният ключ може да бъде споделян с други, докато частният ключ трябва да се пази в тайна. Web Crypto API поддържа генерирането на асиметрични ключове с помощта на метода generateKey().
async function generateRSAKey() {
return await crypto.subtle.generateKey(
{
name: 'RSA-OAEP',
modulusLength: 2048, // The length of the key in bits
publicExponent: new Uint8Array([0x01, 0x00, 0x01]), // Commonly 65537
hash: 'SHA-256',
},
true, // extractable
['encrypt', 'decrypt'] // usages
);
}
// Example usage:
generateRSAKey()
.then((keyPair) => {
console.log('RSA Public Key:', keyPair.publicKey);
console.log('RSA Private Key:', keyPair.privateKey);
// Use the keys for encryption/decryption
})
.catch((err) => console.error('Key generation error:', err));
Подписване на данни
Цифровите подписи се използват за проверка на автентичността и целостта на данните. Подателят подписва данните със своя частен ключ, а получателят проверява подписа с публичния ключ на подателя.
async function signData(privateKey, data) {
const encoder = new TextEncoder();
const dataBuffer = encoder.encode(data);
const signature = await crypto.subtle.sign(
{
name: 'RSASSA-PKCS1-v1_5',
hash: { name: 'SHA-256' },
},
privateKey,
dataBuffer
);
return signature;
}
// Example usage (assuming you have an RSA key pair):
generateRSAKey().then(keyPair => {
signData(keyPair.privateKey, 'Data to sign')
.then((signature) => {
console.log('Signature:', signature);
})
.catch((err) => console.error('Signing error:', err));
});
Проверка на подписи
Проверката на цифров подпис потвърждава, че данните не са били манипулирани и че действително са подписани от твърдения подател.
async function verifySignature(publicKey, signature, data) {
const encoder = new TextEncoder();
const dataBuffer = encoder.encode(data);
const isValid = await crypto.subtle.verify(
{
name: 'RSASSA-PKCS1-v1_5',
hash: { name: 'SHA-256' },
},
publicKey,
signature,
dataBuffer
);
return isValid;
}
// Example usage (assuming you have the RSA key pair and the signature):
generateRSAKey().then(keyPair => {
signData(keyPair.privateKey, 'Data to sign').then(signature => {
verifySignature(keyPair.publicKey, signature, 'Data to sign')
.then((isValid) => {
console.log('Signature is valid:', isValid);
})
.catch((err) => console.error('Verification error:', err));
});
});
Управление на ключове
Правилното управление на ключовете е от решаващо значение за сигурността на всяка криптографска система. Web Crypto API предоставя механизми за генериране, импортиране, експортиране и сигурно съхранение на ключове. Въпреки това, сигурното съхранение на ключове в браузъра може да бъде предизвикателство.
Съображения за съхранение на ключове
- IndexedDB: Една от възможностите е да се съхраняват ключове в IndexedDB, NoSQL база данни, базирана в браузъра. Въпреки това, IndexedDB не е специално проектирана за сигурно съхранение на ключове, затова е важно да се приложат допълнителни мерки за сигурност, като например криптиране на ключовете преди съхраняването им.
- LocalStorage/Cookies: Те обикновено не се препоръчват за съхранение на криптографски ключове поради ограничените им функции за сигурност и потенциала за атаки тип cross-site scripting (XSS).
- Хардуерни модули за сигурност (HSM): В по-напреднали сценарии можете да използвате браузърни разширения или нативни приложения за взаимодействие с хардуерни модули за сигурност (HSM) за сигурно съхранение на ключове и криптографски операции.
Импортиране и експортиране на ключове
Web Crypto API ви позволява да импортирате и експортирате ключове в различни формати, като например:
- JWK (JSON Web Key): JSON-базиран формат за представяне на криптографски ключове.
- PKCS#8: Стандартен формат за съхранение на частни ключове.
- SPKI (Subject Public Key Info): Стандартен формат за съхранение на публични ключове.
Импортирането и експортирането на ключове може да бъде полезно за прехвърляне на ключове между различни системи или за създаване на резервни копия на ключове.
Обвиване и разопаковане на ключове (Key Wrapping)
Обвиването на ключове е процесът на криптиране на един ключ с друг ключ (обвиващия ключ). Това може да се използва за защита на ключове, докато се съхраняват или предават. Web Crypto API поддържа обвиване и разопаковане на ключове с помощта на алгоритми като AES-KW и RSA-OAEP.
Случаи на употреба за Web Crypto API
Web Crypto API отваря широк спектър от възможности за изграждане на сигурни уеб приложения. Ето някои често срещани случаи на употреба:
- Криптиране от страна на клиента: Криптиране на чувствителни данни в браузъра преди изпращането им към сървъра. Това може да защити данните от подслушване и неоторизиран достъп.
- Сигурно удостоверяване: Внедряване на сигурни механизми за удостоверяване, използващи цифрови подписи и протоколи за обмен на ключове.
- Проверки на целостта на данните: Използване на хеширащи алгоритми за проверка на целостта на данните, изтеглени от сървъра.
- Сигурна комуникация: Установяване на сигурни комуникационни канали с помощта на криптиране и протоколи за обмен на ключове.
- Управление на цифрови права (DRM): Внедряване на DRM схеми за защита на съдържание, защитено с авторски права.
- Управление на пароли: Внедряване на сигурни механизми за съхранение и извличане на пароли. Използване на PBKDF2 за хеширане на пароли от страна на клиента преди изпращането им към сървъра.
Съображения за сигурност
Въпреки че Web Crypto API предоставя мощен инструмент за изграждане на сигурни уеб приложения, е важно да сте наясно с потенциалните рискове за сигурността и да следвате най-добрите практики:
- Cross-Site Scripting (XSS): XSS атаките могат да компрометират сигурността на вашето приложение и да позволят на нападателите да откраднат чувствителни данни, включително криптографски ключове. Защитете приложението си от XSS атаки, като правилно почиствате потребителския вход и използвате политики за сигурност на съдържанието (CSP).
- Атаки тип „човек по средата“ (MITM): MITM атаките могат да прихващат и променят мрежовия трафик, потенциално компрометирайки поверителността и целостта на данните. Защитете приложението си от MITM атаки, като използвате HTTPS и проверявате автентичността на сертификатите на сървъра.
- Side-Channel атаки: Side-channel атаките използват информация, изтекла по време на криптографски операции, като например времеви вариации или консумация на енергия, за да възстановят тайни ключове. Web Crypto API е проектиран да смекчава side-channel атаките, но е важно да сте наясно с този риск и да използвате най-добрите практики за криптографско изпълнение.
- Управление на ключове: Сигурното управление на ключовете е от решаващо значение за сигурността на всяка криптографска система. Защитете ключовете си от неоторизиран достъп и се уверете, че те се съхраняват и обработват сигурно.
- Избор на алгоритъм: Изберете криптографски алгоритми и размери на ключовете, които са подходящи за вашите изисквания за сигурност. Избягвайте използването на слаби или остарели алгоритми. Консултирайте се с експерти по сигурността, за да определите най-добрите алгоритми за вашето приложение.
- Редовни актуализации: Поддържайте браузъра и JavaScript библиотеките си актуални с най-новите корекции за сигурност. Уязвимостите в тези компоненти могат да компрометират сигурността на вашето приложение.
Най-добри практики за използване на Web Crypto API
Ето някои най-добри практики за използване на Web Crypto API:
- Използвайте HTTPS: Винаги използвайте HTTPS, за да защитите приложението си от MITM атаки.
- Почиствайте потребителския вход: Правилно почиствайте потребителския вход, за да предотвратите XSS атаки.
- Използвайте политики за сигурност на съдържанието (CSP): Използвайте CSP, за да ограничите ресурсите, които вашето приложение може да зарежда, смекчавайки риска от XSS атаки.
- Избирайте силни алгоритми: Избирайте силни криптографски алгоритми и размери на ключовете, които са подходящи за вашите изисквания за сигурност.
- Внедрете сигурно управление на ключове: Внедрете сигурни практики за управление на ключове, за да защитите ключовете си от неоторизиран достъп.
- Поддържайте софтуера си актуален: Поддържайте браузъра и JavaScript библиотеките си актуални с най-новите корекции за сигурност.
- Тествайте приложението си обстойно: Тествайте приложението си обстойно, за да идентифицирате и отстраните потенциални уязвимости в сигурността.
- Обмислете използването на криптографска библиотека: Въпреки че Web Crypto API е мощен, използването на добре проверена криптографска библиотека (като TweetNaCl.js или CryptoJS) може да осигури допълнителна сигурност и удобство. Тези библиотеки често се справят с детайли на ниско ниво и крайни случаи, намалявайки риска от грешки.
Примери за Web Crypto API в действие
Нека разгледаме няколко примера от реалния свят, където Web Crypto API може да се използва за подобряване на сигурността и поверителността:
Сигурно приложение за съобщения
Сигурно приложение за съобщения може да използва Web Crypto API за криптиране на съобщения от страна на клиента, преди да ги изпрати на сървъра. Това гарантира, че само предвиденият получател може да прочете съобщенията, дори ако сървърът е компрометиран. Потребителите могат да генерират двойки ключове, да криптират съобщения с публичния ключ на получателя и да подписват съобщения със собствения си частен ключ. След това получателят ще използва своя частен ключ, за да декриптира съобщението и да провери подписа на подателя с неговия публичен ключ.
Сигурно съхранение на файлове
Приложение за сигурно съхранение на файлове може да използва Web Crypto API за криптиране на файлове от страна на клиента, преди да ги качи на сървъра. Това защитава файловете от неоторизиран достъп, дори ако сървърът е компрометиран. Потребителите могат да генерират ключове за криптиране, да криптират файлове с тези ключове и след това сигурно да съхраняват криптираните файлове заедно с ключовете (може би обвивайки ключовете за допълнителна защита). Когато потребител иска достъп до файл, приложението ще извлече криптирания файл и съответния ключ, ще декриптира файла от страна на клиента и след това ще го покаже на потребителя.
Разширени теми
Освен основите, Web Crypto API предлага няколко разширени функции за специализирани случаи на употреба:
- Функции за извличане на ключове (KDFs): KDFs се използват за извличане на криптографски ключове от пароли или други тайни стойности. Web Crypto API поддържа PBKDF2 (Password-Based Key Derivation Function 2), широко използвана KDF за извличане на ключове на базата на парола.
- Удостоверено криптиране: Алгоритмите за удостоверено криптиране, като AES-GCM и ChaCha20-Poly1305, осигуряват както поверителност, така и цялост. Те криптират данните и също така генерират таг за удостоверяване, който може да се използва за проверка на целостта на данните.
- Криптография с елиптични криви (ECC): ECC е вид асиметрична криптография, базирана на елиптични криви. Web Crypto API поддържа ECDSA (Elliptic Curve Digital Signature Algorithm) и ECDH (Elliptic Curve Diffie-Hellman), които обикновено се използват за цифрови подписи и обмен на ключове.
Заключение
Web Crypto API предоставя мощен и стандартизиран начин за извършване на криптографски операции директно в браузъра. Това позволява на разработчиците да изграждат сигурни уеб приложения, без да разчитат на обработка от страна на сървъра за чувствителни задачи. Като разбирате основните концепции на Web Crypto API, следвате най-добрите практики и сте наясно с потенциалните рискове за сигурността, можете да използвате този мощен инструмент за подобряване на сигурността и поверителността на вашите уеб приложения. Тъй като уеб приложенията стават все по-сложни и обработват все по-чувствителни данни, Web Crypto API ще играе все по-важна роля в осигуряването на сигурността и поверителността в интернет.