Avastage Web Crypto API, võimas tööriist krüptograafiaks veebilehitsejas. Õppige räsima, krüpteerima ja haldama võtmeid praktiliste näidetega.
Web Crypto API: põhjalik juhend krüptograafiliste operatsioonide kohta
Web Crypto API on JavaScripti API, mis võimaldab arendajatel teostada krüptograafilisi operatsioone otse veebilehitsejas. See avab võimalused turvaliste veebirakenduste loomiseks, ilma et peaks tundlike ülesannete jaoks lootma serveripoolsele töötlemisele. See artikkel annab põhjaliku ülevaate Web Crypto API-st, käsitledes selle peamisi funktsioone, kasutusjuhte ja parimaid tavasid.
Sissejuhatus krüptograafiasse veebilehitsejas
Traditsiooniliselt tegeleti krüptograafiliste operatsioonidega peamiselt serveripoolel turvalisusprobleemide ja kliendipoolse JavaScripti piirangute tõttu. Web Crypto API pakub aga turvalist ja standardiseeritud viisi krüptograafiliste ülesannete teostamiseks otse veebilehitsejas. See võimaldab mitmeid uusi funktsioone, nagu kliendipoolne krüpteerimine, turvaline autentimine ja digitaalallkirjad, ilma et tundlikke andmeid oleks vaja asjatult serverisse edastada.
Kliendipoolse krüptograafia üks suur eelis on serveri koormuse vähendamine. Krüptograafiliste arvutuste veebilehitsejale delegeerimisega saab server keskenduda muudele ülesannetele, parandades rakenduse üldist jõudlust. Lisaks saab kliendipoolne krüpteerimine suurendada kasutajate privaatsust, tagades, et tundlikud andmed krüpteeritakse enne kasutaja seadmest lahkumist.
Web Crypto API põhimõisted
Web Crypto API põhineb järgmistel põhimõistetel:
- Krüptograafilised algoritmid: API toetab erinevaid krüptograafilisi algoritme, sealhulgas sümmeetrilist krüpteerimist (nt AES), asümmeetrilist krüpteerimist (nt RSA), räsialgoritme (nt SHA-256) ja digitaalallkirja algoritme (nt ECDSA).
- Võtmed: Krüptograafilised operatsioonid nõuavad sageli võtmeid. Web Crypto API pakub mehhanisme võtmete turvaliseks genereerimiseks, importimiseks, eksportimiseks ja salvestamiseks. Võtmed võivad olla sümmeetrilised (kasutatakse nii krüpteerimiseks kui ka dekrüpteerimiseks) või asümmeetrilised (koosnevad avalikust ja privaatsest võtmest).
- SubtleCrypto liides:
SubtleCryptoliides on peamine sisenemispunkt krüptograafilistele funktsioonidele juurdepääsemiseks. See pakub meetodeid räsimiseks, krüpteerimiseks, dekrüpteerimiseks, allkirjastamiseks ja kontrollimiseks. - Promises (lubadused): Kõik krüptograafilised operatsioonid Web Crypto API-s on asünkroonsed ja tagastavad lubadusi. See tagab, et veebilehitseja kasutajaliides jääb reageerivaks ka potentsiaalselt aeganõudvate krüptograafiliste ülesannete täitmisel.
Toetatud krüptograafilised algoritmid
Web Crypto API toetab laia valikut krüptograafilisi algoritme. Siin on mõned kõige sagedamini kasutatavad:
Sümmeetriline krüpteerimine
- AES (Advanced Encryption Standard): Laialt levinud sümmeetriline krüpteerimisalgoritm. Web Crypto API toetab AES-CBC, AES-CTR, AES-GCM ja AES-KW režiime.
Asümmeetriline krüpteerimine
- RSA (Rivest-Shamir-Adleman): Populaarne asümmeetriline krüpteerimisalgoritm. Web Crypto API toetab RSA-OAEP ja RSA-PSS täiteskeeme.
- ECDSA (Elliptic Curve Digital Signature Algorithm): Elliptilisel kõveral põhinev krüptograafiline asümmeetriline allkirjaalgoritm.
- ECDH (Elliptic Curve Diffie-Hellman): Elliptilisel kõveral põhinev krüptograafiline võtmekokkuleppe protokoll.
Räsialgoritmid
- SHA-256 (Secure Hash Algorithm 256-bit): Laialdaselt kasutatav räsialgoritm, mis toodab 256-bitise räsiväärtuse.
- SHA-384 (Secure Hash Algorithm 384-bit): Räsialgoritm, mis toodab 384-bitise räsiväärtuse.
- SHA-512 (Secure Hash Algorithm 512-bit): Räsialgoritm, mis toodab 512-bitise räsiväärtuse.
Põhilised krüptograafilised operatsioonid
Uurime mõningaid põhilisi krüptograafilisi operatsioone, kasutades Web Crypto API-t koos koodinäidetega.
Räsimine
Räsimine on andmete teisendamine fikseeritud suurusega märgistringiks (räsiväärtuseks). Räsimist kasutatakse andmete terviklikkuse kontrollimiseks, paroolide salvestamiseks ja indekseerimiseks.
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;
}
// Kasutusnäide:
hashData('Hello, world!')
.then((hash) => console.log('SHA-256 räsi:', hash))
.catch((err) => console.error('Räsimise viga:', err));
Sümmeetriliste võtmete genereerimine
Sümmeetrilisi võtmeid kasutatakse sama võtmega krüpteerimiseks ja dekrüpteerimiseks. Web Crypto API võimaldab genereerida sümmeetrilisi võtmeid meetodiga generateKey().
async function generateAESKey() {
return await crypto.subtle.generateKey(
{
name: 'AES-GCM',
length: 256,
},
true, // eksporditav
['encrypt', 'decrypt'] // kasutusotstarbed
);
}
// Kasutusnäide:
generateAESKey()
.then((key) => {
console.log('AES võti genereeritud:', key);
// Kasutage võtit krüpteerimiseks/dekrüpteerimiseks
})
.catch((err) => console.error('Võtme genereerimise viga:', err));
Andmete krüpteerimine
Krüpteerimine on andmete teisendamine loetamatule kujule, et kaitsta nende konfidentsiaalsust. Siin on näide andmete krüpteerimisest, kasutades AES-GCM-i:
async function encryptData(key, data) {
const encoder = new TextEncoder();
const dataBuffer = encoder.encode(data);
const iv = crypto.getRandomValues(new Uint8Array(12)); // Initsialiseerimisvektor
const encryptedData = await crypto.subtle.encrypt(
{
name: 'AES-GCM',
iv: iv,
},
key,
dataBuffer
);
// Kombineeri IV ja krüpteeritud andmed salvestamiseks/edastamiseks
const combined = new Uint8Array(iv.length + encryptedData.byteLength);
combined.set(iv, 0);
combined.set(new Uint8Array(encryptedData), iv.length);
return combined;
}
// Kasutusnäide (eeldades, et teil on AES võti):
generateAESKey().then(key => {
encryptData(key, 'Sensitive data')
.then((encrypted) => {
console.log('Krüpteeritud andmed:', encrypted);
})
.catch((err) => console.error('Krüpteerimise viga:', err));
});
Andmete dekrüpteerimine
Dekrüpteerimine on krüpteeritud andmete tagasiteisendamine nende algsele, loetavale kujule. Siin on näide AES-GCM-iga krüpteeritud andmete dekrüpteerimisest:
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);
}
// Kasutusnäide (eeldades, et teil on AES võti ja krüpteeritud andmed):
generateAESKey().then(key => {
encryptData(key, 'Sensitive data').then(encrypted => {
decryptData(key, encrypted)
.then((decrypted) => {
console.log('Dekrüpteeritud andmed:', decrypted);
})
.catch((err) => console.error('Dekrüpteerimise viga:', err));
});
});
Asümmeetriliste võtmete genereerimine
Asümmeetrilised võtmed koosnevad avalikust ja privaatsest võtmest. Avalikku võtit võib teistega jagada, samas kui privaatne võti tuleb hoida salajas. Web Crypto API toetab asümmeetriliste võtmete genereerimist meetodiga generateKey().
async function generateRSAKey() {
return await crypto.subtle.generateKey(
{
name: 'RSA-OAEP',
modulusLength: 2048, // Võtme pikkus bittides
publicExponent: new Uint8Array([0x01, 0x00, 0x01]), // Tavaliselt 65537
hash: 'SHA-256',
},
true, // eksporditav
['encrypt', 'decrypt'] // kasutusotstarbed
);
}
// Kasutusnäide:
generateRSAKey()
.then((keyPair) => {
console.log('RSA avalik võti:', keyPair.publicKey);
console.log('RSA privaatne võti:', keyPair.privateKey);
// Kasutage võtmeid krüpteerimiseks/dekrüpteerimiseks
})
.catch((err) => console.error('Võtme genereerimise viga:', err));
Andmete allkirjastamine
Digitaalallkirju kasutatakse andmete autentsuse ja terviklikkuse kontrollimiseks. Saatja allkirjastab andmed oma privaatse võtmega ja vastuvõtja kontrollib allkirja saatja avaliku võtmega.
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;
}
// Kasutusnäide (eeldades, et teil on RSA võtmepaar):
generateRSAKey().then(keyPair => {
signData(keyPair.privateKey, 'Data to sign')
.then((signature) => {
console.log('Allkiri:', signature);
})
.catch((err) => console.error('Allkirjastamise viga:', err));
});
Allkirjade kontrollimine
Digitaalallkirja kontrollimine kinnitab, et andmeid ei ole rikutud ja et need on tõepoolest allkirjastanud väidetav saatja.
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;
}
// Kasutusnäide (eeldades, et teil on RSA võtmepaar ja allkiri):
generateRSAKey().then(keyPair => {
signData(keyPair.privateKey, 'Data to sign').then(signature => {
verifySignature(keyPair.publicKey, signature, 'Data to sign')
.then((isValid) => {
console.log('Allkiri on kehtiv:', isValid);
})
.catch((err) => console.error('Kontrollimise viga:', err));
});
});
Võtmehaldus
Nõuetekohane võtmehaldus on iga krüptograafilise süsteemi turvalisuse seisukohast ülioluline. Web Crypto API pakub mehhanisme võtmete turvaliseks genereerimiseks, importimiseks, eksportimiseks ja salvestamiseks. Siiski võib võtmete turvaline salvestamine veebilehitsejas olla keeruline.
Võtmete salvestamise kaalutlused
- IndexedDB: Üks võimalus on salvestada võtmed IndexedDB-sse, mis on brauseripõhine NoSQL-andmebaas. Siiski ei ole IndexedDB spetsiaalselt loodud turvaliseks võtmete salvestamiseks, seega on oluline rakendada täiendavaid turvameetmeid, näiteks võtmete krüpteerimine enne nende salvestamist.
- LocalStorage/Cookies: Neid ei soovitata üldiselt krüptograafiliste võtmete salvestamiseks nende piiratud turvafunktsioonide ja võimalike saidiülese skriptimise (XSS) rünnakute tõttu.
- Riistvaralised turvamoodulid (HSM-id): Keerukamate stsenaariumide korral saate kasutada brauserilaiendusi või natiivrakendusi, et suhelda riistvaraliste turvamoodulitega (HSM) turvaliseks võtmete salvestamiseks ja krüptograafilisteks operatsioonideks.
Võtmete import ja eksport
Web Crypto API võimaldab importida ja eksportida võtmeid erinevates vormingutes, näiteks:
- JWK (JSON Web Key): JSON-põhine vorming krüptograafiliste võtmete esitamiseks.
- PKCS#8: Standardvorming privaatvõtmete salvestamiseks.
- SPKI (Subject Public Key Info): Standardvorming avalike võtmete salvestamiseks.
Võtmete importimine ja eksportimine võib olla kasulik võtmete ülekandmisel erinevate süsteemide vahel või võtmete varundamiseks.
Võtmete "pakkimine" ja "lahtipakkimine"
Võtme "pakkimine" (wrapping) on võtme krüpteerimine teise võtmega (pakkimisvõtmega). Seda saab kasutada võtmete kaitsmiseks nende salvestamise või edastamise ajal. Web Crypto API toetab võtmete pakkimist ja lahtipakkimist, kasutades algoritme nagu AES-KW ja RSA-OAEP.
Web Crypto API kasutusjuhud
Web Crypto API avab laia valiku võimalusi turvaliste veebirakenduste loomiseks. Siin on mõned levinumad kasutusjuhud:
- Kliendipoolne krüpteerimine: Tundlike andmete krüpteerimine veebilehitsejas enne serverisse saatmist. See võib kaitsta andmeid pealtkuulamise ja volitamata juurdepääsu eest.
- Turvaline autentimine: Turvaliste autentimismehhanismide rakendamine, kasutades digitaalallkirju ja võtmevahetusprotokolle.
- Andmete terviklikkuse kontroll: Räsialgoritmide kasutamine serverist alla laaditud andmete terviklikkuse kontrollimiseks.
- Turvaline side: Turvaliste sidekanalite loomine krüpteerimis- ja võtmevahetusprotokollide abil.
- Digitaalsete õiguste haldus (DRM): DRM-skeemide rakendamine autoriõigustega kaitstud sisu kaitsmiseks.
- Paroolihaldus: Turvaliste paroolide salvestamise ja hankimise mehhanismide rakendamine. PBKDF2 kasutamine paroolide kliendipoolseks räsimiseks enne nende serverisse saatmist.
Turvakaalutlused
Kuigi Web Crypto API pakub võimsat tööriista turvaliste veebirakenduste loomiseks, on oluline olla teadlik võimalikest turvariskidest ja järgida parimaid tavasid:
- Saidiülene skriptimine (XSS): XSS-rünnakud võivad ohustada teie rakenduse turvalisust ja võimaldada ründajatel varastada tundlikke andmeid, sealhulgas krüptograafilisi võtmeid. Kaitske oma rakendust XSS-rünnakute eest, puhastades korralikult kasutajate sisestatud andmeid ja kasutades sisuturbe poliitikaid (CSP).
- Vahendajarünnakud (MITM): MITM-rünnakud võivad võrguliiklust pealt kuulata ja muuta, seades potentsiaalselt ohtu andmete konfidentsiaalsuse ja terviklikkuse. Kaitske oma rakendust MITM-rünnakute eest, kasutades HTTPS-i ja kontrollides serveri sertifikaatide autentsust.
- Kõrvalkanali rünnakud: Kõrvalkanali rünnakud kasutavad krüptograafiliste operatsioonide ajal lekkinud teavet, näiteks ajastuse variatsioone või energiatarbimist, salajaste võtmete taastamiseks. Web Crypto API on loodud kõrvalkanali rünnakute leevendamiseks, kuid on oluline olla sellest riskist teadlik ja kasutada krüptograafilise rakenduse parimaid tavasid.
- Võtmehaldus: Turvaline võtmehaldus on iga krüptograafilise süsteemi turvalisuse seisukohast ülioluline. Kaitske oma võtmeid volitamata juurdepääsu eest ja tagage, et neid hoitakse ja käsitletakse turvaliselt.
- Algoritmi valik: Valige oma turvanõuetele vastavad krüptograafilised algoritmid ja võtme suurused. Vältige nõrkade või vananenud algoritmide kasutamist. Konsulteerige turvaekspertidega, et määrata oma rakenduse jaoks parimad algoritmid.
- Regulaarsed uuendused: Hoidke oma veebilehitseja ja JavaScripti teegid ajakohastena, paigaldades uusimad turvapaigad. Nendes komponentides esinevad haavatavused võivad ohustada teie rakenduse turvalisust.
Web Crypto API kasutamise parimad tavad
Siin on mõned parimad tavad Web Crypto API kasutamiseks:
- Kasutage HTTPS-i: Kasutage alati HTTPS-i, et kaitsta oma rakendust MITM-rünnakute eest.
- Puhastage kasutaja sisend: Puhastage kasutajate sisestatud andmed korralikult, et vältida XSS-rünnakuid.
- Kasutage sisuturbe poliitikaid (CSP): Kasutage CSP-sid, et piirata ressursse, mida teie rakendus saab laadida, leevendades XSS-rünnakute riski.
- Valige tugevad algoritmid: Valige oma turvanõuetele vastavad tugevad krüptograafilised algoritmid ja võtme suurused.
- Rakendage turvaline võtmehaldus: Rakendage turvalisi võtmehalduspraktikaid, et kaitsta oma võtmeid volitamata juurdepääsu eest.
- Hoidke oma tarkvara ajakohasena: Hoidke oma veebilehitseja ja JavaScripti teegid ajakohastena, paigaldades uusimad turvapaigad.
- Testige oma rakendust põhjalikult: Testige oma rakendust põhjalikult, et tuvastada ja parandada potentsiaalseid turvaauke.
- Kaaluge krüptograafiateegi kasutamist: Kuigi Web Crypto API on võimas, võib hästi kontrollitud krüptograafiateegi (nagu TweetNaCl.js või CryptoJS) kasutamine pakkuda täiendavat turvalisust ja mugavust. Need teegid tegelevad sageli madala taseme detailide ja erijuhtudega, vähendades vigade riski.
Web Crypto API kasutusnäited
Vaatame paari reaalset näidet, kus Web Crypto API-t saab kasutada turvalisuse ja privaatsuse parandamiseks:
Turvaline sõnumirakendus
Turvaline sõnumirakendus saab kasutada Web Crypto API-t sõnumite kliendipoolseks krüpteerimiseks enne nende serverisse saatmist. See tagab, et ainult sihtsaaja saab sõnumeid lugeda, isegi kui server on kompromiteeritud. Kasutajad saaksid genereerida võtmepaare, krüpteerida sõnumeid saaja avaliku võtmega ja allkirjastada sõnumeid oma privaatse võtmega. Saaja kasutaks seejärel oma privaatset võtit sõnumi dekrüpteerimiseks ja saatja allkirja kontrollimiseks tema avaliku võtmega.
Turvaline failihoidla
Turvaline failihoidla rakendus saab kasutada Web Crypto API-t failide kliendipoolseks krüpteerimiseks enne nende serverisse üleslaadimist. See kaitseb faile volitamata juurdepääsu eest, isegi kui server on kompromiteeritud. Kasutajad saaksid genereerida krüpteerimisvõtmeid, krüpteerida nendega faile ja seejärel turvaliselt salvestada krüpteeritud failid koos võtmetega (võib-olla pakkides võtmed lisakaitseks). Kui kasutaja soovib failile juurde pääseda, hangiks rakendus krüpteeritud faili ja vastava võtme, dekrüpteeriks faili kliendipoolselt ja kuvaks selle seejärel kasutajale.
Edasijõudnute teemad
Lisaks põhitõdedele pakub Web Crypto API mitmeid täiustatud funktsioone spetsialiseeritud kasutusjuhtude jaoks:
- Võtme tuletamise funktsioonid (KDF-id): KDF-e kasutatakse krüptograafiliste võtmete tuletamiseks paroolidest või muudest salajastest väärtustest. Web Crypto API toetab PBKDF2-te (Password-Based Key Derivation Function 2), mis on laialdaselt kasutatav KDF paroolipõhiseks võtmete tuletamiseks.
- Autenditud krüpteerimine: Autenditud krüpteerimisalgoritmid, nagu AES-GCM ja ChaCha20-Poly1305, pakuvad nii konfidentsiaalsust kui ka terviklikkust. Nad krüpteerivad andmed ja genereerivad ka autentimissildi, mida saab kasutada andmete terviklikkuse kontrollimiseks.
- Elliptilise kõvera krüptograafia (ECC): ECC on elliptilistel kõveratel põhinev asümmeetrilise krüptograafia tüüp. Web Crypto API toetab ECDSA-d (Elliptic Curve Digital Signature Algorithm) ja ECDH-d (Elliptic Curve Diffie-Hellman), mida kasutatakse tavaliselt digitaalallkirjade ja võtmevahetuse jaoks.
Kokkuvõte
Web Crypto API pakub võimsat ja standardiseeritud viisi krüptograafiliste operatsioonide teostamiseks otse veebilehitsejas. See võimaldab arendajatel luua turvalisi veebirakendusi, ilma et peaks tundlike ülesannete jaoks lootma serveripoolsele töötlemisele. Mõistes Web Crypto API põhimõisteid, järgides parimaid tavasid ja olles teadlik võimalikest turvariskidest, saate seda võimsat tööriista kasutada oma veebirakenduste turvalisuse ja privaatsuse parandamiseks. Kuna veebirakendused muutuvad üha keerukamaks ja käsitlevad üha tundlikumaid andmeid, mängib Web Crypto API veebi turvalisuse ja privaatsuse tagamisel üha olulisemat rolli.