Web Crypto API: Tarayıcı Tabanlı Şifreleme İşlemleri
Merhaba değerli okuyucular! Bugün, modern web uygulamalarında güvenliği artırmak için kullanılan önemli bir araç olan Web Crypto API'yi inceleyeceğiz. Bu API, tarayıcı tabanlı şifreleme işlemlerini nasıl gerçekleştirebileceğimizi, kullanım alanlarını ve best practice'leri ele alacağız. Hazırsanız, tarayıcı tabanlı kriptografinin dünyasına dalalım!
Web Crypto API Nedir?
Web Crypto API, web uygulamalarında temel kriptografik işlemleri gerçekleştirmek için kullanılan güçlü ve standart bir JavaScript API'sidir. Bu API, şifreleme, şifre çözme, imzalama, doğrulama ve anahtar yönetimi gibi işlemleri tarayıcı ortamında güvenli bir şekilde gerçekleştirmenize olanak tanır.
Web Crypto API'nin Temel Bileşenleri
- SubtleCrypto Interface: Temel kriptografik işlemleri gerçekleştiren ana arayüz.
- CryptoKey Interface: Kriptografik anahtarları temsil eder.
- Algorithms: RSA, AES, ECDSA gibi çeşitli şifreleme algoritmalarını destekler.
Temel Kullanım Örnekleri
1. Rastgele Sayı Üretimi
function generateRandomNumbers(length) { const array = new Uint8Array(length); crypto.getRandomValues(array); return array; } console.log(generateRandomNumbers(16));
2. AES-GCM ile Şifreleme ve Şifre Çözme
async function encryptData(data, key) { const enc = new TextEncoder(); const encodedData = enc.encode(data); const iv = crypto.getRandomValues(new Uint8Array(12)); const encryptedContent = await crypto.subtle.encrypt( { name: "AES-GCM", iv: iv }, key, encodedData ); return { encryptedContent, iv }; } async function decryptData(encryptedData, key, iv) { const decryptedContent = await crypto.subtle.decrypt( { name: "AES-GCM", iv: iv }, key, encryptedData ); const dec = new TextDecoder(); return dec.decode(decryptedContent); } // Kullanım (async () => { const key = await crypto.subtle.generateKey( { name: "AES-GCM", length: 256 }, true, ["encrypt", "decrypt"] ); const data = "Gizli mesaj"; const { encryptedContent, iv } = await encryptData(data, key); console.log("Şifrelenmiş veri:", encryptedContent); const decryptedData = await decryptData(encryptedContent, key, iv); console.log("Çözülmüş veri:", decryptedData); })();
3. RSA ile İmzalama ve Doğrulama
async function generateRSAKeyPair() { return await crypto.subtle.generateKey( { name: "RSA-PSS", modulusLength: 2048, publicExponent: new Uint8Array([1, 0, 1]), hash: "SHA-256", }, true, ["sign", "verify"] ); } async function signData(data, privateKey) { const enc = new TextEncoder(); const encodedData = enc.encode(data); return await crypto.subtle.sign( { name: "RSA-PSS", saltLength: 32 }, privateKey, encodedData ); } async function verifySignature(data, signature, publicKey) { const enc = new TextEncoder(); const encodedData = enc.encode(data); return await crypto.subtle.verify( { name: "RSA-PSS", saltLength: 32 }, publicKey, signature, encodedData ); } // Kullanım (async () => { const keyPair = await generateRSAKeyPair(); const data = "İmzalanacak veri"; const signature = await signData(data, keyPair.privateKey); console.log("İmza:", signature); const isValid = await verifySignature(data, signature, keyPair.publicKey); console.log("İmza geçerli mi?", isValid); })();
Web Crypto API Best Practices
1. Güçlü Algoritmalar Kullanın
AES-GCM, RSA-OAEP, ECDSA gibi modern ve güvenli algoritmaları tercih edin.
2. Anahtar Yönetimine Dikkat Edin
Anahtarları güvenli bir şekilde saklayın ve yönetin. Mümkünse, anahtarları tarayıcı dışında tutun.
3. Salt ve IV Kullanın
Şifreleme işlemlerinde her zaman taze salt ve IV (Initialization Vector) kullanın.
4. Hata Yönetimi
Kriptografik işlemlerdeki hataları dikkatli bir şekilde yönetin ve kullanıcıya hassas bilgiler sızdırmayın.
5. HTTPS Kullanın
Web Crypto API'yi her zaman HTTPS üzerinden kullanın.
İleri Düzey Kullanım: Anahtar Türetme ve Şifre Tabanlı Şifreleme
async function deriveKey(password, salt) { const enc = new TextEncoder(); const keyMaterial = await crypto.subtle.importKey( "raw", enc.encode(password), { name: "PBKDF2" }, false, ["deriveBits", "deriveKey"] ); return await crypto.subtle.deriveKey( { name: "PBKDF2", salt: salt, iterations: 100000, hash: "SHA-256" }, keyMaterial, { name: "AES-GCM", length: 256 }, true, ["encrypt", "decrypt"] ); } async function encryptWithPassword(data, password) { const enc = new TextEncoder(); const salt = crypto.getRandomValues(new Uint8Array(16)); const iv = crypto.getRandomValues(new Uint8Array(12)); const key = await deriveKey(password, salt); const encryptedContent = await crypto.subtle.encrypt( { name: "AES-GCM", iv: iv }, key, enc.encode(data) ); return { salt: salt, iv: iv, encryptedContent: new Uint8Array(encryptedContent) }; } async function decryptWithPassword(encryptedData, password) { const key = await deriveKey(password, encryptedData.salt); const decryptedContent = await crypto.subtle.decrypt( { name: "AES-GCM", iv: encryptedData.iv }, key, encryptedData.encryptedContent ); const dec = new TextDecoder(); return dec.decode(decryptedContent); } // Kullanım (async () => { const data = "Çok gizli mesaj"; const password = "güçlü-parola"; const encryptedData = await encryptWithPassword(data, password); console.log("Şifrelenmiş veri:", encryptedData); const decryptedData = await decryptWithPassword(encryptedData, password); console.log("Çözülmüş veri:", decryptedData); })();
Web Crypto API'nin Sınırlamaları
- Tarayıcı desteği: Eski tarayıcılarda destek sınırlı olabilir.
- Performans: Büyük veri setleri için performans sorunları yaşanabilir.
- Anahtar saklama: Tarayıcıda güvenli anahtar saklama konusunda sınırlamalar vardır.
- Algoritma desteği: Bazı özel kriptografik algoritmalar desteklenmeyebilir.
Web Crypto API, modern web uygulamalarında güvenli kriptografik işlemler gerçekleştirmek için güçlü bir araçtır. Bu API sayesinde, şifreleme, imzalama ve anahtar yönetimi gibi kritik güvenlik işlemlerini tarayıcı ortamında gerçekleştirebilirsiniz.
Ancak, Web Crypto API'yi kullanırken güvenlik best practice'lerine dikkat etmek, güçlü algoritmaları tercih etmek ve anahtarları güvenli bir şekilde yönetmek çok önemlidir. Ayrıca, bu API'nin sınırlamalarının farkında olmak ve gerektiğinde sunucu taraflı kriptografi ile desteklemek de düşünülmelidir.
Web Crypto API, client-side güvenliği artırmak için mükemmel bir araçtır, ancak genel uygulama güvenliğinin sadece bir parçası olduğunu unutmayın. Kapsamlı bir güvenlik stratejisi için, bu API'yi diğer güvenlik önlemleriyle birlikte kullanmak önemlidir.
Siz Web Crypto API'yi projelerinizde nasıl kullanıyorsunuz? Karşılaştığınız zorluklar veya paylaşmak istediğiniz best practice'ler var mı? Yorumlarınızı bekliyorum!
Güvenli kodlamalar ve güvenli web uygulamaları dilerim!