Tutustu Web Crypto API:hin, tehokkaaseen työkaluun kryptografisten operaatioiden suorittamiseen suoraan selaimessa. Opi tiivistyksestä, salauksesta, allekirjoituksista ja avainten hallinnasta käytännön esimerkein.
Web Crypto API: Kattava opas kryptografisiin operaatioihin
Web Crypto API on JavaScript API, joka mahdollistaa kehittäjille kryptografisten operaatioiden suorittamisen suoraan selaimessa. Tämä avaa mahdollisuuksia turvallisten verkkosovellusten rakentamiseen ilman, että herkkien tehtävien käsittelyyn tarvitaan palvelinpuolen suoritusta. Tämä artikkeli tarjoaa kattavan yleiskatsauksen Web Crypto API:iin, sen keskeisiin toimintoihin, käyttötapauksiin ja parhaisiin käytäntöihin.
Johdatus selainten kryptografiaan
Perinteisesti kryptografiset operaatiot on hoidettu pääasiassa palvelinpuolella turvallisuusnäkökohtien ja asiakaspuolen JavaScriptin rajoitusten vuoksi. Web Crypto API tarjoaa kuitenkin turvallisen ja standardoidun tavan suorittaa kryptografisia tehtäviä suoraan selaimessa. Tämä mahdollistaa monien uusien ominaisuuksien, kuten asiakaspuolen salauksen, turvallisen tunnistautumisen ja digitaalisten allekirjoitusten käytön, ilman, että arkaluonteisia tietoja välitetään tarpeettomasti palvelimelle.
Yksi merkittävä asiakaspuolen kryptografian etu on palvelimen kuormituksen väheneminen. Siirtämällä kryptografiset laskelmat selaimelle palvelin voi keskittyä muihin tehtäviin, parantaen sovelluksen yleistä suorituskykyä. Lisäksi asiakaspuolen salaus voi parantaa käyttäjän yksityisyyttä varmistamalla, että arkaluonteiset tiedot salataan ennen kuin ne poistuvat käyttäjän laitteelta.
Web Crypto API:n ydinkäsitteet
Web Crypto API perustuu seuraaviin ydinkäsitteisiin:
- Kryptografiset algoritmit: API tukee erilaisia kryptografisia algoritmeja, mukaan lukien symmetrinen salaus (esim. AES), epäsymmetrinen salaus (esim. RSA), tiivistysalgoritmit (esim. SHA-256) ja digitaaliset allekirjoitusalgoritmit (esim. ECDSA).
- Avaimet: Kryptografiset operaatiot vaativat usein avaimia. Web Crypto API tarjoaa mekanismeja avainten turvalliseen luomiseen, tuomiseen, viemiseen ja tallentamiseen. Avaimet voivat olla symmetrisiä (käytetään sekä salaukseen että purkuun) tai epäsymmetrisiä (koostuvat julkisesta avaimesta ja yksityisestä avaimesta).
- SubtleCrypto-rajapinta:
SubtleCrypto-rajapinta on pääasiallinen pääsypiste kryptografisiin toimintoihin. Se tarjoaa menetelmiä tiivistämiseen, salaukseen, purkuun, allekirjoittamiseen ja varmentamiseen. - Lupaukset: Kaikki Web Crypto API:n kryptografiset operaatiot ovat epäsynkronisia ja palauttavat lupauksia. Tämä varmistaa, että selaimen käyttöliittymä pysyy responsiivina samalla, kun suoritetaan potentiaalisesti aikaa vieviä kryptografisia tehtäviä.
Tuetut kryptografiset algoritmit
Web Crypto API tukee laajaa valikoimaa kryptografisia algoritmeja. Tässä joitakin yleisimmin käytetyistä:
Symmetrinen salaus
- AES (Advanced Encryption Standard): Laajalti käytetty symmetrinen salausalgoritmi. Web Crypto API tukee AES-CBC-, AES-CTR-, AES-GCM- ja AES-KW-tiloja.
Epäsymmetrinen salaus
- RSA (Rivest-Shamir-Adleman): Suosittu epäsymmetrinen salausalgoritmi. Web Crypto API tukee RSA-OAEP- ja RSA-PSS-täyttömekanismeja.
- ECDSA (Elliptic Curve Digital Signature Algorithm): Epäsymmetrinen allekirjoitusalgoritmi, joka perustuu elliptisten käyrien kryptografiaan.
- ECDH (Elliptic Curve Diffie-Hellman): Avaintenvaihtoprotokolla, joka perustuu elliptisten käyrien kryptografiaan.
Tiivistysalgoritmit
- SHA-256 (Secure Hash Algorithm 256-bit): Laajalti käytetty tiivistysalgoritmi, joka tuottaa 256-bittisen tiivisteen.
- SHA-384 (Secure Hash Algorithm 384-bit): Tiivistysalgoritmi, joka tuottaa 384-bittisen tiivisteen.
- SHA-512 (Secure Hash Algorithm 512-bit): Tiivistysalgoritmi, joka tuottaa 512-bittisen tiivisteen.
Peruskryptografiset operaatiot
Tutustutaanpa muutamiin peruskryptografisiin operaatioihin käyttämällä Web Crypto API:ta koodiesimerkkien avulla.
Tiivistäminen
Tiivistäminen on prosessi, jossa tieto muunnetaan kiinteän kokoiseksi merkkijonoksi (tiiviste). Tiivistystä käytetään tietojen eheyden tarkistamiseen, salasanojen tallentamiseen ja indeksointiin.
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;
}
// Esimerkkikäyttö:
hashData('Hello, world!')
.then((hash) => console.log('SHA-256 Hash:', hash))
.catch((err) => console.error('Tiivistysvirhe:', err));
Symmetristen avainten luominen
Symmetrisiä avaimia käytetään salaukseen ja purkuun samalla avaimella. Web Crypto API mahdollistaa symmetristen avainten luomisen generateKey()-metodin avulla.
async function generateAESKey() {
return await crypto.subtle.generateKey(
{
name: 'AES-GCM',
length: 256,
},
true, // purettavissa
['encrypt', 'decrypt'] // käyttötarkoitukset
);
}
// Esimerkkikäyttö:
generateAESKey()
.then((key) => {
console.log('AES-avain luotu:', key);
// Käytä avainta salaukseen/purkuun
})
.catch((err) => console.error('Avaimenluontivirhe:', err));
Tietojen salaaminen
Salaus on prosessi, jossa tieto muunnetaan lukukelvottomaan muotoon sen luottamuksellisuuden suojaamiseksi. Tässä esimerkki tietojen salaamisesta AES-GCM:llä:
async function encryptData(key, data) {
const encoder = new TextEncoder();
const dataBuffer = encoder.encode(data);
const iv = crypto.getRandomValues(new Uint8Array(12)); // Alustusvektori
const encryptedData = await crypto.subtle.encrypt(
{
name: 'AES-GCM',
iv: iv,
},
key,
dataBuffer
);
// Yhdistä IV ja salattu data tallennusta/lähetystä varten
const combined = new Uint8Array(iv.length + encryptedData.byteLength);
combined.set(iv, 0);
combined.set(new Uint8Array(encryptedData), iv.length);
return combined;
}
// Esimerkkikäyttö (oletetaan, että sinulla on AES-avain):
generateAESKey().then(key => {
encryptData(key, 'Sensitive data')
.then((encrypted) => {
console.log('Salattu data:', encrypted);
})
.catch((err) => console.error('Salausvirhe:', err));
});
Tietojen purkaminen
Purku on prosessi, jossa salattu tieto muunnetaan takaisin alkuperäiseen, luettavaan muotoon. Tässä esimerkki tietojen purkamisesta AES-GCM:llä salatusta datasta:
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);
}
// Esimerkkikäyttö (oletetaan, että sinulla on AES-avain ja salattu data):
generateAESKey().then(key => {
encryptData(key, 'Sensitive data').then(encrypted => {
decryptData(key, encrypted)
.then((decrypted) => {
console.log('Purettu data:', decrypted);
})
.catch((err) => console.error('Purkuvirhe:', err));
});
});
Epäsymmetristen avainten luominen
Epäsymmetriset avaimet koostuvat julkisesta ja yksityisestä avaimesta. Julkinen avain voidaan jakaa muille, kun taas yksityinen avain on pidettävä salassa. Web Crypto API tukee epäsymmetristen avainten luomista generateKey()-metodin avulla.
async function generateRSAKey() {
return await crypto.subtle.generateKey(
{
name: 'RSA-OAEP',
modulusLength: 2048, // Avaimen pituus bitteinä
publicExponent: new Uint8Array([0x01, 0x00, 0x01]), // Yleensä 65537
hash: 'SHA-256',
},
true, // purettavissa
['encrypt', 'decrypt'] // käyttötarkoitukset
);
}
// Esimerkkikäyttö:
generateRSAKey()
.then((keyPair) => {
console.log('RSA julkinen avain:', keyPair.publicKey);
console.log('RSA yksityinen avain:', keyPair.privateKey);
// Käytä avaimia salaukseen/purkuun
})
.catch((err) => console.error('Avaimenluontivirhe:', err));
Tietojen allekirjoittaminen
Digitaalisia allekirjoituksia käytetään tietojen aitouden ja eheyden varmistamiseen. Lähettäjä allekirjoittaa tiedot yksityisellä avaimellaan, ja vastaanottaja varmentaa allekirjoituksen lähettäjän julkisella avaimella.
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;
}
// Esimerkkikäyttö (oletetaan, että sinulla on RSA-avainpari):
generateRSAKey().then(keyPair => {
signData(keyPair.privateKey, 'Data to sign')
.then((signature) => {
console.log('Allekirjoitus:', signature);
})
.catch((err) => console.error('Allekirjoitusvirhe:', err));
});
Allekirjoitusten varmentaminen
Digitaalisen allekirjoituksen varmentaminen vahvistaa, että tietoja ei ole peukaloitu ja että ne on todella allekirjoittanut ilmoitettu lähettäjä.
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;
}
// Esimerkkikäyttö (oletetaan, että sinulla on RSA-avainpari ja allekirjoitus):
generateRSAKey().then(keyPair => {
signData(keyPair.privateKey, 'Data to sign').then(signature => {
verifySignature(keyPair.publicKey, signature, 'Data to sign')
.then((isValid) => {
console.log('Allekirjoitus on kelvollinen:', isValid);
})
.catch((err) => console.error('Varmennusvirhe:', err));
});
});
Avainten hallinta
Oikea avainten hallinta on välttämätöntä minkä tahansa kryptografisen järjestelmän turvallisuudelle. Web Crypto API tarjoaa mekanismeja avainten turvalliseen luomiseen, tuomiseen, viemiseen ja tallentamiseen. Avainten turvallinen tallentaminen selaimessa voi kuitenkin olla haastavaa.
Avainten tallennuksen näkökohdat
- IndexedDB: Yksi vaihtoehto on tallentaa avaimet IndexedDB:hen, joka on selainpohjainen NoSQL-tietokanta. IndexedDB ei kuitenkaan ole erityisesti suunniteltu turvalliseen avainten tallennukseen, joten on tärkeää toteuttaa lisäturvatoimia, kuten avainten salaaminen ennen niiden tallentamista.
- LocalStorage/Cookies: Näitä ei yleensä suositella kryptografisten avainten tallentamiseen niiden rajallisten turvallisuusominaisuuksien ja mahdollisuuden vuoksi ristikkäissivustoisen komentosarjahyökkäyksen (XSS) varalta.
- Laitteistoturvamoduulit (HSM): Edistyneemmissä skenaarioissa voit käyttää selainlaajennuksia tai natiivisovelluksia laitteistoturvamoduulien (HSM) kanssa turvalliseen avainten tallennukseen ja kryptografisiin operaatioihin.
Avainten tuonti ja vienti
Web Crypto API mahdollistaa avainten tuonnin ja viennin eri muodoissa, kuten:
- JWK (JSON Web Key): JSON-pohjainen muoto kryptografisten avainten esittämiseen.
- PKCS#8: Standardi muoto yksityisten avainten tallentamiseen.
- SPKI (Subject Public Key Info): Standardi muoto julkisten avainten tallentamiseen.
Avainten tuonti ja vienti voi olla hyödyllistä avainten siirtämiseen eri järjestelmien välillä tai avainten varmuuskopiointiin.
Avainten kääriminen ja purku
Avainten kääriminen on prosessi, jossa avain salataan toisella avaimella (käärimisavaimella). Sitä voidaan käyttää avainten suojaamiseen niiden tallennuksen tai siirron aikana. Web Crypto API tukee avainten käärimistä ja purkua käyttämällä algoritmeja kuten AES-KW ja RSA-OAEP.
Web Crypto API:n käyttötapaukset
Web Crypto API avaa laajan kirjon mahdollisuuksia turvallisten verkkosovellusten rakentamiseen. Tässä muutamia yleisiä käyttötapauksia:
- Asiakaspuolen salaus: Salaa arkaluonteiset tiedot selaimessa ennen niiden lähettämistä palvelimelle. Tämä voi suojata tietoja salakuuntelulta ja luvattomalta käytöltä.
- Turvallinen tunnistautuminen: Toteuta turvallisia tunnistautumismekanismeja digitaalisilla allekirjoituksilla ja avaintenvaihtoprotokollilla.
- Tietojen eheyden tarkistukset: Käytä tiivistysalgoritmeja palvelimelta ladattujen tietojen eheyden varmistamiseen.
- Turvallinen viestintä: Luo turvallisia viestintäkanavia käyttämällä salausta ja avaintenvaihtoprotokollia.
- Digitaalisten oikeuksien hallinta (DRM): Toteuta DRM-järjestelmiä tekijänoikeudella suojatun sisällön suojaamiseksi.
- Salasanan hallinta: Toteuta turvallisia salasanan tallennus- ja hakumekanismeja. Käyttämällä PBKDF2:ta salasanojen tiivistämiseen asiakaspuolella ennen niiden lähettämistä palvelimelle.
Turvallisuusnäkökohdat
Vaikka Web Crypto API tarjoaa tehokkaan työkalun turvallisten verkkosovellusten rakentamiseen, on tärkeää olla tietoinen mahdollisista turvallisuusriskeistä ja noudattaa parhaita käytäntöjä:
- Ristikkäissivustoiset komentosarjahyökkäykset (XSS): XSS-hyökkäykset voivat vaarantaa sovelluksesi turvallisuuden ja antaa hyökkääjille mahdollisuuden varastaa arkaluonteisia tietoja, mukaan lukien kryptografiset avaimet. Suojaa sovelluksesi XSS-hyökkäyksiltä puhdistamalla asianmukaisesti käyttäjän syötteet ja käyttämällä sisältöturvakäytäntöjä (CSP).
- Man-in-the-Middle (MITM) -hyökkäykset: MITM-hyökkäykset voivat siepata ja muokata verkkoliikennettä, mikä voi vaarantaa tietojen luottamuksellisuuden ja eheyden. Suojaa sovelluksesi MITM-hyökkäyksiltä käyttämällä HTTPS:ää ja varmistamalla palvelinsertifikaattien aitous.
- Sivukanavahyökkäykset: Sivukanavahyökkäykset hyödyntävät kryptografisten operaatioiden aikana vuotaneita tietoja, kuten ajoitusvaihteluita tai virrankulutusta, paljastaakseen salaisia avaimia. Web Crypto API on suunniteltu lieventämään sivukanavahyökkäyksiä, mutta on tärkeää olla tietoinen tästä riskistä ja noudattaa parhaita käytäntöjä kryptografisessa toteutuksessa.
- Avainten hallinta: Turvallinen avainten hallinta on ratkaisevan tärkeää minkä tahansa kryptografisen järjestelmän turvallisuudelle. Suojaa avaimesi luvattomalta käytöltä ja varmista, että ne tallennetaan ja käsitellään turvallisesti.
- Algoritmien valinta: Valitse kryptografiset algoritmit ja avainkoot, jotka sopivat turvallisuusvaatimuksiisi. Vältä heikkojen tai vanhentuneiden algoritmien käyttöä. Keskustele turvallisuusasiantuntijoiden kanssa parhaiden algoritmien määrittämiseksi sovellukseesi.
- Säännölliset päivitykset: Pidä selaimesi ja JavaScript-kirjastosi ajan tasalla uusimpien turvakorjausten kanssa. Näiden komponenttien haavoittuvuudet voivat vaarantaa sovelluksesi turvallisuuden.
Parhaat käytännöt Web Crypto API:n käyttöön
Tässä muutamia parhaita käytäntöjä Web Crypto API:n käyttöön:
- Käytä HTTPS:ää: Käytä aina HTTPS:ää suojataksesi sovelluksesi MITM-hyökkäyksiltä.
- Puhdista käyttäjän syötteet: Puhdista käyttäjän syötteet asianmukaisesti XSS-hyökkäysten estämiseksi.
- Käytä sisältöturvakäytäntöjä (CSP): Käytä CSP:itä rajoittamaan sovelluksesi lataamien resurssien määrää, mikä vähentää XSS-hyökkäysten riskiä.
- Valitse vahvat algoritmit: Valitse vahvat kryptografiset algoritmit ja avainkoot, jotka sopivat turvallisuusvaatimuksiisi.
- Toteuta turvallinen avainten hallinta: Toteuta turvalliset avaintenhallintakäytännöt suojataksesi avaimesi luvattomalta käytöltä.
- Pidä ohjelmistosi ajan tasalla: Pidä selaimesi ja JavaScript-kirjastosi ajan tasalla uusimpien turvakorjausten kanssa.
- Testaa sovelluksesi perusteellisesti: Testaa sovelluksesi perusteellisesti mahdollisten turvallisuushaavoittuvuuksien tunnistamiseksi ja korjaamiseksi.
- Harkitse kryptografiakirjastoa: Vaikka Web Crypto API on tehokas, hyvin tarkastetun kryptografiakirjaston (kuten TweetNaCl.js tai CryptoJS) käyttö voi tarjota lisäturvaa ja mukavuutta. Nämä kirjastot käsittelevät usein matalan tason yksityiskohtia ja reunatapauksia, mikä vähentää virheiden riskiä.
Esimerkkejä Web Crypto API:n käytöstä
Tarkastellaanpa paria todellista esimerkkiä, joissa Web Crypto API:ta voidaan käyttää turvallisuuden ja yksityisyyden parantamiseen:
Turvallinen viestisovellus
Turvallinen viestisovellus voi käyttää Web Crypto API:ta viestien salaamiseen asiakaspuolella ennen niiden lähettämistä palvelimelle. Tämä varmistaa, että vain aiottu vastaanottaja voi lukea viestit, vaikka palvelin vaarantuisikin. Käyttäjät voisivat luoda avainpareja, salata viestit vastaanottajan julkisella avaimella ja allekirjoittaa viestit omalla yksityisellä avaimellaan. Vastaanottaja käyttäisi sitten yksityistä avaintaan viestin purkamiseen ja lähettäjän allekirjoituksen varmentamiseen julkisella avaimellaan.
Turvallinen tiedostojen tallennus
Turvallinen tiedostojen tallennussovellus voi käyttää Web Crypto API:ta tiedostojen salaamiseen asiakaspuolella ennen niiden lataamista palvelimelle. Tämä suojaa tiedostoja luvattomalta käytöltä, vaikka palvelin vaarantuisikin. Käyttäjät voisivat luoda salausavaimia, salata tiedostot näillä avaimilla ja sitten tallentaa salatut tiedostot turvallisesti yhdessä avainten kanssa (ehkä käärimällä avaimet lisäsuojaksi). Kun käyttäjä haluaa käyttää tiedostoa, sovellus hakisi salatun tiedoston ja vastaavan avaimen, purkaisi tiedoston asiakaspuolella ja näyttäisi sen sitten käyttäjälle.
Edistyneet aiheet
Perusasioiden lisäksi Web Crypto API tarjoaa useita edistyneitä ominaisuuksia erikoistuneisiin käyttötapauksiin:
- Avainten johtamistoiminnot (KDF): KDF:iä käytetään kryptografisten avainten johtamiseen salasanoista tai muista salaisista arvoista. Web Crypto API tukee PBKDF2:ta (Password-Based Key Derivation Function 2), joka on laajalti käytetty KDF salasanoihin perustuvaan avainten johtamiseen.
- Varmennettu salaus: Varmennetut salausalgoritmit, kuten AES-GCM ja ChaCha20-Poly1305, tarjoavat sekä luottamuksellisuutta että eheyttä. Ne salaavat tiedot ja luovat myös varmennustagin, jota voidaan käyttää tietojen eheyden varmistamiseen.
- Elliptisten käyrien kryptografia (ECC): ECC on eräänlainen epäsymmetrinen kryptografia, joka perustuu elliptisiin käyriin. Web Crypto API tukee ECDSA:ta (Elliptic Curve Digital Signature Algorithm) ja ECDH:ta (Elliptic Curve Diffie-Hellman), joita käytetään yleisesti digitaalisiin allekirjoituksiin ja avaintenvaihtoon.
Yhteenveto
Web Crypto API tarjoaa tehokkaan ja standardoidun tavan suorittaa kryptografisia operaatioita suoraan selaimessa. Tämä mahdollistaa kehittäjille turvallisten verkkosovellusten rakentamisen ilman, että herkkien tehtävien käsittelyyn tarvitaan palvelinpuolen suoritusta. Ymmärtämällä Web Crypto API:n ydinkäsitteet, noudattamalla parhaita käytäntöjä ja olemalla tietoisia mahdollisista turvallisuusriskeistä, voit hyödyntää tätä tehokasta työkalua parantaaksesi verkkosovellustesi turvallisuutta ja yksityisyyttä. Kun verkkosovellukset muuttuvat yhä monimutkaisemmiksi ja käsittelevät enemmän arkaluonteisia tietoja, Web Crypto API:lla on yhä tärkeämpi rooli verkon turvallisuuden ja yksityisyyden varmistamisessa.