Doğrudan tarayıcıda kriptografik işlemler gerçekleştirmek için güçlü bir araç olan Web Crypto API'sini keşfedin. Pratik örneklerle hashleme, şifreleme, imzalar ve anahtar yönetimi hakkında bilgi edinin.
Web Crypto API: Kriptografik İşlemlere Kapsamlı Bir Bakış
Web Crypto API, geliştiricilerin doğrudan tarayıcıda kriptografik işlemler gerçekleştirmesine olanak tanıyan bir JavaScript API'sidir. Bu, hassas görevler için sunucu tarafı işlemeye güvenmeden güvenli web uygulamaları oluşturmak için olanaklar sunar. Bu makale, Web Crypto API'sinin temel işlevlerini, kullanım durumlarını ve en iyi uygulamalarını kapsayan kapsamlı bir genel bakış sunmaktadır.
Tarayıcıda Kriptografiye Giriş
Geleneksel olarak, kriptografik işlemler öncelikle güvenlik endişeleri ve istemci tarafı JavaScript'in sınırlamaları nedeniyle sunucu tarafında ele alınırdı. Ancak, Web Crypto API, kriptografik görevleri doğrudan tarayıcıda gerçekleştirmek için güvenli ve standartlaştırılmış bir yol sağlar. Bu, istemci tarafı şifreleme, güvenli kimlik doğrulama ve dijital imzalar gibi bir dizi yeni özelliği, hassas verileri gereksiz yere sunucuya iletmeden mümkün kılar.
İstemci tarafı kriptografinin en büyük avantajlarından biri, sunucu yükünün azalmasıdır. Kriptografik hesaplamaları tarayıcıya aktararak, sunucu diğer görevlere odaklanabilir ve genel uygulama performansını artırabilir. Ayrıca, istemci tarafı şifreleme, hassas verilerin kullanıcının cihazından ayrılmadan önce şifrelenmesini sağlayarak kullanıcı gizliliğini artırabilir.
Web Crypto API'sinin Temel Kavramları
Web Crypto API, aşağıdaki temel kavramlara dayanmaktadır:
- Kriptografi Algoritmaları: API, simetrik şifreleme (örn. AES), asimetrik şifreleme (örn. RSA), hashleme algoritmaları (örn. SHA-256) ve dijital imza algoritmaları (örn. ECDSA) dahil olmak üzere çeşitli kriptografik algoritmaları destekler.
- Anahtarlar: Kriptografik işlemler genellikle anahtarlar gerektirir. Web Crypto API, anahtarları güvenli bir şekilde oluşturmak, içe aktarmak, dışa aktarmak ve depolamak için mekanizmalar sağlar. Anahtarlar simetrik (hem şifreleme hem de şifre çözme için kullanılır) veya asimetrik (bir ortak anahtar ve bir özel anahtardan oluşur) olabilir.
- SubtleCrypto Arayüzü:
SubtleCryptoarayüzü, kriptografik işlevlere erişmek için ana giriş noktasıdır. Hashleme, şifreleme, şifre çözme, imzalama ve doğrulama için yöntemler sağlar. - Promises: Web Crypto API'sindeki tüm kriptografik işlemler eşzamansızdır ve promises döndürür. Bu, tarayıcının kullanıcı arayüzünün potansiyel olarak zaman alan kriptografik görevleri gerçekleştirirken yanıt vermeye devam etmesini sağlar.
Desteklenen Kriptografik Algoritmalar
Web Crypto API, çok çeşitli kriptografik algoritmaları destekler. İşte en sık kullanılanlardan bazıları:
Simetrik Şifreleme
- AES (Gelişmiş Şifreleme Standardı): Yaygın olarak kullanılan bir simetrik şifreleme algoritması. Web Crypto API, AES-CBC, AES-CTR, AES-GCM ve AES-KW modlarını destekler.
Asimetrik Şifreleme
- RSA (Rivest-Shamir-Adleman): Popüler bir asimetrik şifreleme algoritması. Web Crypto API, RSA-OAEP ve RSA-PSS dolgu şemalarını destekler.
- ECDSA (Eliptik Eğri Dijital İmza Algoritması): Eliptik eğri kriptografisine dayalı bir asimetrik imza algoritması.
- ECDH (Eliptik Eğri Diffie-Hellman): Eliptik eğri kriptografisine dayalı bir anahtar anlaşma protokolü.
Hashleme Algoritmaları
- SHA-256 (Güvenli Hash Algoritması 256-bit): 256 bitlik bir hash değeri üreten yaygın olarak kullanılan bir hashleme algoritması.
- SHA-384 (Güvenli Hash Algoritması 384-bit): 384 bitlik bir hash değeri üreten bir hashleme algoritması.
- SHA-512 (Güvenli Hash Algoritması 512-bit): 512 bitlik bir hash değeri üreten bir hashleme algoritması.
Temel Kriptografik İşlemler
Web Crypto API'sini kullanarak bazı temel kriptografik işlemleri kod örnekleriyle keşfedelim.
Hashleme
Hashleme, verileri sabit boyutlu bir karakter dizisine (hash değeri) dönüştürme işlemidir. Hashleme, veri bütünlüğü kontrolleri, parola depolama ve indeksleme için kullanılır.
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));
Simetrik Anahtarlar Oluşturma
Simetrik anahtarlar, aynı anahtarla şifreleme ve şifre çözme için kullanılır. Web Crypto API, generateKey() yöntemini kullanarak simetrik anahtarlar oluşturmanıza olanak tanır.
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));
Veri Şifreleme
Şifreleme, verileri gizliliğini korumak için okunamaz bir biçime dönüştürme işlemidir. İşte AES-GCM kullanarak verileri şifreleme örneği:
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));
});
Veri Şifre Çözme
Şifre çözme, şifrelenmiş verileri orijinal, okunabilir biçimine geri dönüştürme işlemidir. İşte AES-GCM ile şifrelenmiş verilerin şifresini çözme örneği:
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));
});
});
Asimetrik Anahtarlar Oluşturma
Asimetrik anahtarlar, bir ortak anahtar ve bir özel anahtardan oluşur. Ortak anahtar başkalarıyla paylaşılabilirken, özel anahtar gizli tutulmalıdır. Web Crypto API, generateKey() yöntemini kullanarak asimetrik anahtarlar oluşturmayı destekler.
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));
Veri İmzalama
Dijital imzalar, verilerin gerçekliğini ve bütünlüğünü doğrulamak için kullanılır. Gönderen, verileri özel anahtarıyla imzalar ve alıcı, imzayı gönderenin ortak anahtarıyla doğrular.
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));
});
İmzaları Doğrulama
Bir dijital imzayı doğrulamak, verilerin kurcalanmadığını ve gerçekten iddia edilen gönderen tarafından imzalandığını doğrular.
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));
});
});
Anahtar Yönetimi
Uygun anahtar yönetimi, herhangi bir kriptografik sistemin güvenliği için çok önemlidir. Web Crypto API, anahtarları güvenli bir şekilde oluşturmak, içe aktarmak, dışa aktarmak ve depolamak için mekanizmalar sağlar. Ancak, anahtarları tarayıcıda güvenli bir şekilde depolamak zor olabilir.
Anahtar Depolama Hususları
- IndexedDB: Bir seçenek, anahtarları tarayıcı tabanlı bir NoSQL veritabanı olan IndexedDB'de depolamaktır. Ancak, IndexedDB özellikle güvenli anahtar depolama için tasarlanmamıştır, bu nedenle anahtarları depolamadan önce şifrelemek gibi ek güvenlik önlemleri uygulamak önemlidir.
- LocalStorage/Cookies: Bunlar, sınırlı güvenlik özellikleri ve siteler arası komut dosyası (XSS) saldırıları potansiyeli nedeniyle kriptografik anahtarları depolamak için genellikle önerilmez.
- Donanım Güvenlik Modülleri (HSM'ler): Daha gelişmiş senaryolarda, güvenli anahtar depolama ve kriptografik işlemler için donanım güvenlik modülleri (HSM'ler) ile arayüz oluşturmak için tarayıcı uzantılarını veya yerel uygulamaları kullanabilirsiniz.
Anahtar İçe Aktarma ve Dışa Aktarma
Web Crypto API, anahtarları aşağıdakiler gibi çeşitli biçimlerde içe ve dışa aktarmanıza olanak tanır:
- JWK (JSON Web Key): Kriptografik anahtarları temsil etmek için JSON tabanlı bir biçim.
- PKCS#8: Özel anahtarları depolamak için standart bir biçim.
- SPKI (Subject Public Key Info): Ortak anahtarları depolamak için standart bir biçim.
Anahtarları içe ve dışa aktarmak, anahtarları farklı sistemler arasında aktarmak veya anahtarları yedeklemek için yararlı olabilir.
Anahtar Sarma ve Açma
Anahtar sarma, bir anahtarı başka bir anahtarla (sarma anahtarı) şifreleme işlemidir. Bu, anahtarlar depolanırken veya iletilirken anahtarları korumak için kullanılabilir. Web Crypto API, AES-KW ve RSA-OAEP gibi algoritmalar kullanarak anahtar sarma ve açmayı destekler.
Web Crypto API için Kullanım Durumları
Web Crypto API, güvenli web uygulamaları oluşturmak için çok çeşitli olanaklar sunar. İşte bazı yaygın kullanım durumları:
- İstemci Tarafı Şifreleme: Hassas verileri sunucuya göndermeden önce tarayıcıda şifreleyin. Bu, verileri dinlemeye ve yetkisiz erişime karşı koruyabilir.
- Güvenli Kimlik Doğrulama: Dijital imzalar ve anahtar değişim protokolleri kullanarak güvenli kimlik doğrulama mekanizmaları uygulayın.
- Veri Bütünlüğü Kontrolleri: Sunucudan indirilen verilerin bütünlüğünü doğrulamak için hashleme algoritmalarını kullanın.
- Güvenli İletişim: Şifreleme ve anahtar değişim protokolleri kullanarak güvenli iletişim kanalları kurun.
- Dijital Haklar Yönetimi (DRM): Telif hakkıyla korunan içeriği korumak için DRM şemaları uygulayın.
- Parola Yönetimi: Güvenli parola depolama ve geri alma mekanizmaları uygulayın. Parolaları sunucuya göndermeden önce istemci tarafında hashlemek için PBKDF2'yi kullanın.
Güvenlik Hususları
Web Crypto API, güvenli web uygulamaları oluşturmak için güçlü bir araç sağlarken, potansiyel güvenlik risklerinin farkında olmak ve en iyi uygulamaları takip etmek önemlidir:
- Siteler Arası Komut Dosyası (XSS): XSS saldırıları, uygulamanızın güvenliğini tehlikeye atabilir ve saldırganların kriptografik anahtarlar dahil olmak üzere hassas verileri çalmasına olanak tanır. Kullanıcı girişini uygun şekilde temizleyerek ve içerik güvenliği ilkeleri (CSP'ler) kullanarak uygulamanızı XSS saldırılarına karşı koruyun.
- Ortadaki Adam (MITM) Saldırıları: MITM saldırıları, ağ trafiğini engelleyebilir ve değiştirebilir, potansiyel olarak verilerin gizliliğini ve bütünlüğünü tehlikeye atabilir. HTTPS kullanarak ve sunucu sertifikalarının gerçekliğini doğrulayarak uygulamanızı MITM saldırılarına karşı koruyun.
- Yan Kanal Saldırıları: Yan kanal saldırıları, gizli anahtarları kurtarmak için zamanlama varyasyonları veya güç tüketimi gibi kriptografik işlemler sırasında sızan bilgileri kullanır. Web Crypto API, yan kanal saldırılarını azaltmak için tasarlanmıştır, ancak bu riskin farkında olmak ve kriptografik uygulama için en iyi uygulamaları kullanmak önemlidir.
- Anahtar Yönetimi: Güvenli anahtar yönetimi, herhangi bir kriptografik sistemin güvenliği için çok önemlidir. Anahtarlarınızı yetkisiz erişime karşı koruyun ve güvenli bir şekilde depolanıp işlendiğinden emin olun.
- Algoritma Seçimi: Güvenlik gereksinimlerinize uygun kriptografik algoritmalar ve anahtar boyutları seçin. Zayıf veya güncel olmayan algoritmalar kullanmaktan kaçının. Uygulamanız için en iyi algoritmaları belirlemek için güvenlik uzmanlarına danışın.
- Düzenli Güncellemeler: Tarayıcınızı ve JavaScript kitaplıklarınızı en son güvenlik yamalarıyla güncel tutun. Bu bileşenlerdeki güvenlik açıkları, uygulamanızın güvenliğini tehlikeye atabilir.
Web Crypto API'sini Kullanmak için En İyi Uygulamalar
Web Crypto API'sini kullanmak için bazı en iyi uygulamalar şunlardır:
- HTTPS Kullanın: Uygulamanızı MITM saldırılarına karşı korumak için her zaman HTTPS kullanın.
- Kullanıcı Girişini Temizleyin: XSS saldırılarını önlemek için kullanıcı girişini uygun şekilde temizleyin.
- İçerik Güvenliği İlkelerini (CSP'ler) Kullanın: Uygulamanızın yükleyebileceği kaynakları kısıtlamak ve XSS saldırısı riskini azaltmak için CSP'ler kullanın.
- Güçlü Algoritmalar Seçin: Güvenlik gereksinimlerinize uygun güçlü kriptografik algoritmalar ve anahtar boyutları seçin.
- Güvenli Anahtar Yönetimi Uygulayın: Anahtarlarınızı yetkisiz erişime karşı korumak için güvenli anahtar yönetimi uygulamaları uygulayın.
- Yazılımınızı Güncel Tutun: Tarayıcınızı ve JavaScript kitaplıklarınızı en son güvenlik yamalarıyla güncel tutun.
- Uygulamanızı Kapsamlı Bir Şekilde Test Edin: Potansiyel güvenlik açıklarını belirlemek ve düzeltmek için uygulamanızı kapsamlı bir şekilde test edin.
- Bir Kriptografi Kitaplığı Düşünün: Web Crypto API güçlü olsa da, iyi incelenmiş bir kriptografi kitaplığı (TweetNaCl.js veya CryptoJS gibi) kullanmak ek güvenlik ve kolaylık sağlayabilir. Bu kitaplıklar genellikle düşük seviyeli ayrıntıları ve uç durumları ele alarak hata riskini azaltır.
Web Crypto API'sinin Eylemdeki Örnekleri
Web Crypto API'sinin güvenliği ve gizliliği artırmak için kullanılabileceği birkaç gerçek dünya örneğini ele alalım:
Güvenli Mesajlaşma Uygulaması
Güvenli bir mesajlaşma uygulaması, mesajları sunucuya göndermeden önce istemci tarafında şifrelemek için Web Crypto API'sini kullanabilir. Bu, sunucu tehlikeye girse bile yalnızca amaçlanan alıcının mesajları okuyabilmesini sağlar. Kullanıcılar anahtar çiftleri oluşturabilir, mesajları alıcının ortak anahtarıyla şifreleyebilir ve mesajları kendi özel anahtarlarıyla imzalayabilir. Alıcı daha sonra mesajın şifresini çözmek için özel anahtarını kullanır ve gönderenin imzasını ortak anahtarıyla doğrular.
Güvenli Dosya Depolama
Güvenli bir dosya depolama uygulaması, dosyaları sunucuya yüklemeden önce istemci tarafında şifrelemek için Web Crypto API'sini kullanabilir. Bu, sunucu tehlikeye girse bile dosyaları yetkisiz erişime karşı korur. Kullanıcılar şifreleme anahtarları oluşturabilir, dosyaları bu anahtarlarla şifreleyebilir ve ardından şifrelenmiş dosyaları anahtarlarla birlikte güvenli bir şekilde depolayabilir (belki de ek koruma için anahtarları sararak). Bir kullanıcı bir dosyaya erişmek istediğinde, uygulama şifrelenmiş dosyayı ve karşılık gelen anahtarı alır, dosyanın şifresini istemci tarafında çözer ve ardından kullanıcıya görüntüler.
Gelişmiş Konular
Temel bilgilerin ötesinde, Web Crypto API özel kullanım durumları için çeşitli gelişmiş özellikler sunar:
- Anahtar Türetme İşlevleri (KDF'ler): KDF'ler, parolalardan veya diğer gizli değerlerden kriptografik anahtarlar türetmek için kullanılır. Web Crypto API, parola tabanlı anahtar türetme için yaygın olarak kullanılan bir KDF olan PBKDF2'yi (Parola Tabanlı Anahtar Türetme İşlevi 2) destekler.
- Kimliği Doğrulanmış Şifreleme: AES-GCM ve ChaCha20-Poly1305 gibi kimliği doğrulanmış şifreleme algoritmaları hem gizlilik hem de bütünlük sağlar. Verileri şifrelerler ve ayrıca verilerin bütünlüğünü doğrulamak için kullanılabilecek bir kimlik doğrulama etiketi oluştururlar.
- Eliptik Eğri Kriptografisi (ECC): ECC, eliptik eğrilere dayalı bir tür asimetrik kriptografidir. Web Crypto API, dijital imzalar ve anahtar değişimi için yaygın olarak kullanılan ECDSA'yı (Eliptik Eğri Dijital İmza Algoritması) ve ECDH'yi (Eliptik Eğri Diffie-Hellman) destekler.
Sonuç
Web Crypto API, kriptografik işlemleri doğrudan tarayıcıda gerçekleştirmek için güçlü ve standartlaştırılmış bir yol sağlar. Bu, geliştiricilerin hassas görevler için sunucu tarafı işlemeye güvenmeden güvenli web uygulamaları oluşturmasına olanak tanır. Web Crypto API'sinin temel kavramlarını anlayarak, en iyi uygulamaları takip ederek ve potansiyel güvenlik risklerinin farkında olarak, web uygulamalarınızın güvenliğini ve gizliliğini artırmak için bu güçlü araçtan yararlanabilirsiniz. Web uygulamaları giderek daha karmaşık hale geldikçe ve daha hassas verileri işledikçe, Web Crypto API, web'in güvenliğini ve gizliliğini sağlamada giderek daha önemli bir rol oynayacaktır.