Dalam era digital hari ini, mendapatkan maklumat sensitif seperti kunci API, kata laluan dan data pengguna adalah lebih kritikal berbanding sebelum ini. Strategi penyulitan dan penyahsulitan yang teguh boleh menghalang capaian yang tidak dibenarkan dan memastikan kerahsiaan data. Dalam catatan blog ini, kami akan meneroka cara menyulitkan dan menyahsulit teks menggunakan JavaScript vanila, memanfaatkan API Web Crypto untuk pendekatan moden dan selamat.
Penyulitan mengubah data yang boleh dibaca (teks biasa) kepada format yang diselitkan (teks sifir) yang hanya boleh dibaca jika dinyahsulit dengan kekunci yang betul. Ini memastikan bahawa walaupun seseorang memintas data yang disulitkan, ia tetap tidak bermakna tanpa kunci. Mekanisme penyulitan yang kukuh melindungi:
Mari kita mendalami cara anda boleh melaksanakan perkara ini dengan selamat dalam JavaScript.
Kami akan menggunakan AES-GCM (Standard Penyulitan Lanjutan - Mod Galois/Counter), standard moden yang menyediakan kedua-dua penyulitan dan pengesahan integriti. Langkah-langkahnya melibatkan:
Berikut ialah pelaksanaan JavaScript yang lengkap.
Kami akan menukar antara ArrayBuffer dan perenambelasan untuk penyimpanan dan pengambilan data yang mudah:
function arrayBufferToHex(buffer) { return [...new Uint8Array(buffer)] .map(byte => byte.toString(16).padStart(2, '0')) .join(''); } function hexToArrayBuffer(hex) { const bytes = new Uint8Array(hex.length / 2); for (let i = 0; i < hex.length; i += 2) { bytes[i / 2] = parseInt(hex.substr(i, 2), 16); } return bytes.buffer; }
Gunakan PBKDF2 untuk mendapatkan kunci penyulitan yang kuat:
async function getCryptoKey(password) { const encoder = new TextEncoder(); const keyMaterial = encoder.encode(password); return crypto.subtle.importKey( 'raw', keyMaterial, { name: 'PBKDF2' }, false, ['deriveKey'] ); } async function deriveKey(password, salt) { const keyMaterial = await getCryptoKey(password); return crypto.subtle.deriveKey( { name: 'PBKDF2', salt: salt, iterations: 100000, hash: 'SHA-256' }, keyMaterial, { name: 'AES-GCM', length: 256 }, false, ['encrypt', 'decrypt'] ); }
Sulitkan teks dengan kata laluan:
async function encryptText(text, password) { const encoder = new TextEncoder(); const salt = crypto.getRandomValues(new Uint8Array(16)); const iv = crypto.getRandomValues(new Uint8Array(12)); const key = await deriveKey(password, salt); const encrypted = await crypto.subtle.encrypt( { name: 'AES-GCM', iv: iv }, key, encoder.encode(text) ); return { cipherText: arrayBufferToHex(encrypted), iv: arrayBufferToHex(iv), salt: arrayBufferToHex(salt) }; }
Nyahsulit teks dengan kata laluan yang sama:
async function decryptText(encryptedData, password) { const { cipherText, iv, salt } = encryptedData; const key = await deriveKey(password, hexToArrayBuffer(salt)); const decrypted = await crypto.subtle.decrypt( { name: 'AES-GCM', iv: hexToArrayBuffer(iv) }, key, hexToArrayBuffer(cipherText) ); const decoder = new TextDecoder(); return decoder.decode(decrypted); }
Mari lihat cara menggunakan fungsi ini:
function arrayBufferToHex(buffer) { return [...new Uint8Array(buffer)] .map(byte => byte.toString(16).padStart(2, '0')) .join(''); } function hexToArrayBuffer(hex) { const bytes = new Uint8Array(hex.length / 2); for (let i = 0; i < hex.length; i += 2) { bytes[i / 2] = parseInt(hex.substr(i, 2), 16); } return bytes.buffer; }
Menyulitkan maklumat sensitif seperti kunci API ialah langkah asas dalam melindungi aplikasi anda. Saya menggunakan ini untuk kunci API kebanyakannya.
Atas ialah kandungan terperinci Penyulitan dan Penyahsulitan Teks Selamat dengan JavaScript Vanila. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!