Rumah > hujung hadapan web > tutorial js > Kriptografi dalam JavaScript: Panduan Praktikal

Kriptografi dalam JavaScript: Panduan Praktikal

Patricia Arquette
Lepaskan: 2024-12-05 06:25:17
asal
159 orang telah melayarinya

Cryptography in JavaScript: A Practical Guide

Kriptografi melindungi data dengan mengubahnya menjadi format yang hanya boleh difahami oleh penerima yang dimaksudkan. Ia penting untuk mendapatkan kata laluan, transaksi dalam talian dan komunikasi sensitif. Di bawah, anda akan belajar tentang penyulitan, pencincangan dan menggunakan JavaScript untuk melaksanakannya.


Apakah Kriptografi?

Kriptografi mengubah data boleh dibaca (teks biasa) kepada format tidak boleh dibaca (teks sifir). Hanya pihak yang diberi kuasa boleh membalikkan proses.

Konsep Utama:

  • Penyulitan: Menukar teks biasa kepada teks sifir.
  • Penyahsulitan: Membalikkan teks sifir kembali kepada teks biasa menggunakan kekunci.

Jenis Penyulitan

1. Penyulitan Simetri

Menggunakan kunci yang sama untuk penyulitan dan penyahsulitan. Kunci mesti dikongsi dengan selamat antara penghantar dan penerima. AES ialah jenis algoritma penyulitan simetri yang digunakan secara meluas yang melindungi data dengan menukarkannya kepada format yang tidak boleh dibaca. Ia bergantung pada kunci rahsia dan menyokong panjang kunci 128, 192 atau 256-bit, memberikan perlindungan yang kuat terhadap akses tanpa kebenaran. AES adalah penting untuk:

  • Melindungi Komunikasi Internet: Melindungi interaksi dalam talian seperti HTTPS.
  • Melindungi Data Sensitif: Memastikan kerahsiaan dalam penyimpanan dan penghantaran.
  • Menyulitkan Fail: Menyimpan maklumat peribadi dan profesional selamat.

Elemen Utama AES

Elemen utama AES termasuk kunci dan Vektor Permulaan (IV). Kuncinya ialah nilai rahsia yang dikongsi antara pihak, menentukan cara data disulitkan dan dinyahsulit, dan ia mesti sentiasa kekal sulit. IV ialah nilai rawak yang digunakan bersama kunci untuk memastikan bahawa teks biasa yang sama menyulitkan kepada teks sifir yang berbeza, menambah rawak untuk mengelakkan pengecaman corak. Walaupun IV boleh didedahkan kepada umum, ia tidak boleh digunakan semula dengan kunci yang sama. Bersama-sama, elemen ini membolehkan AES menentang ancaman siber dengan berkesan, menjadikannya asas keselamatan data.

Contoh: AES (Standard Penyulitan Lanjutan)

AES menyulitkan data menggunakan kunci kongsi dan vektor permulaan (IV) untuk menambahkan rawak.

const crypto = require('crypto');

const algorithm = 'aes-256-cbc';
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);

function encrypt(text) {
  const cipher = crypto.createCipheriv(algorithm, key, iv);
  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  return { encrypted, iv: iv.toString('hex'), key: key.toString('hex') };
}

function decrypt(encrypted, ivHex, keyHex) {
  const decipher = crypto.createDecipheriv(algorithm, Buffer.from(keyHex, 'hex'), Buffer.from(ivHex, 'hex'));
  let decrypted = decipher.update(encrypted, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}

// Usage
const message = "Secret Message";
const encryptedData = encrypt(message);
console.log("Encrypted:", encryptedData);

const decryptedMessage = decrypt(encryptedData.encrypted, encryptedData.iv, encryptedData.key);
console.log("Decrypted:", decryptedMessage);

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

2. Penyulitan Asimetri

Untuk mencipta sistem yang disulitkan selamat, penyulitan asimetri selalunya merupakan penyelesaiannya. Ia menggunakan dua kekunci: kunci awam untuk penyulitan dan kunci peribadi untuk penyahsulitan. Persediaan ini membolehkan komunikasi selamat tanpa berkongsi satu kunci.

Bagaimana Ia Berfungsi

  1. Penjanaan Pasangan Utama

    Pasangan kunci awam-swasta dijana. Kunci awam dikongsi secara terbuka, manakala kunci peribadi kekal sulit.

  2. Penyulitan

    Kunci awam penerima menyulitkan data. Hanya kunci peribadi mereka boleh menyahsulitnya, memastikan data selamat walaupun dipintas.

  3. Penyahsulitan

    Penerima menyahsulit data menggunakan kunci peribadi mereka.

const crypto = require('crypto');

const algorithm = 'aes-256-cbc';
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);

function encrypt(text) {
  const cipher = crypto.createCipheriv(algorithm, key, iv);
  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  return { encrypted, iv: iv.toString('hex'), key: key.toString('hex') };
}

function decrypt(encrypted, ivHex, keyHex) {
  const decipher = crypto.createDecipheriv(algorithm, Buffer.from(keyHex, 'hex'), Buffer.from(ivHex, 'hex'));
  let decrypted = decipher.update(encrypted, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}

// Usage
const message = "Secret Message";
const encryptedData = encrypt(message);
console.log("Encrypted:", encryptedData);

const decryptedMessage = decrypt(encryptedData.encrypted, encryptedData.iv, encryptedData.key);
console.log("Decrypted:", decryptedMessage);

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Hashing dalam Kriptografi

Pencincangan menukar data kepada rentetan panjang tetap (cincang) tidak boleh diterbalikkan. Ia biasanya digunakan untuk mengesahkan integriti data dan menyimpan kata laluan dengan selamat.

Algoritma Hashing Popular:

  • SHA-256: Selamat dan digunakan secara meluas.
  • SHA-3: Lebih baharu dengan keselamatan yang dipertingkatkan.
  • MD5 dan SHA-1: Ditamatkan kerana kelemahan.

Contoh Pencincangan Rentetan dalam Node.js

const crypto = require('crypto');

// Generate keys
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 2048 });

const data = "Confidential Data";

// Encrypt
const encrypted = crypto.publicEncrypt(publicKey, Buffer.from(data));
console.log("Encrypted:", encrypted.toString('base64'));

// Decrypt
const decrypted = crypto.privateDecrypt(privateKey, encrypted);
console.log("Decrypted:", decrypted.toString());

Salin selepas log masuk
Salin selepas log masuk

Penyulitan lwn. Hashing

Ciri Penyulitan Hashing
Feature Encryption Hashing
Process Two-way (encrypt/decrypt) One-way
Purpose Data confidentiality Data integrity
Reversible Yes No
Example AES, RSA SHA-256, bcrypt
Proses Dua hala (sulit/nyahsulit) Sehala Tujuan Kerahsiaan data Integriti data Boleh Balik Ya Tidak Contoh AES, RSA SHA-256, bcrypt table>

Contoh Praktikal: Penyulitan Asimetri dalam Projek

Dalam projek saya Whisper, kami menggunakan penyulitan asimetri untuk menjamin mesej sembang tanpa nama. Mesej disulitkan dengan kunci awam penerima, memastikan hanya penerima boleh menyahsulitnya menggunakan kunci peribadi mereka.

Untuk pelaksanaan React pihak pelanggan, kami menggunakan crypto-js untuk penyulitan dan penyahsulitan:

const crypto = require('crypto');

const algorithm = 'aes-256-cbc';
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);

function encrypt(text) {
  const cipher = crypto.createCipheriv(algorithm, key, iv);
  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  return { encrypted, iv: iv.toString('hex'), key: key.toString('hex') };
}

function decrypt(encrypted, ivHex, keyHex) {
  const decipher = crypto.createDecipheriv(algorithm, Buffer.from(keyHex, 'hex'), Buffer.from(ivHex, 'hex'));
  let decrypted = decipher.update(encrypted, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}

// Usage
const message = "Secret Message";
const encryptedData = encrypt(message);
console.log("Encrypted:", encryptedData);

const decryptedMessage = decrypt(encryptedData.encrypted, encryptedData.iv, encryptedData.key);
console.log("Decrypted:", decryptedMessage);

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Penyahsulitan menggunakan kunci peribadi:

const crypto = require('crypto');

// Generate keys
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 2048 });

const data = "Confidential Data";

// Encrypt
const encrypted = crypto.publicEncrypt(publicKey, Buffer.from(data));
console.log("Encrypted:", encrypted.toString('base64'));

// Decrypt
const decrypted = crypto.privateDecrypt(privateKey, encrypted);
console.log("Decrypted:", decrypted.toString());

Salin selepas log masuk
Salin selepas log masuk

Terokai Kod Whisper untuk contoh terperinci.


Kesimpulan

Kriptografi mengukuhkan keselamatan data dalam aplikasi. Gunakan penyulitan simetri seperti AES untuk senario kunci kongsi dan penyulitan asimetri untuk sistem kunci awam-swasta. Hashing memastikan integriti data, terutamanya untuk kata laluan. Pilih pendekatan kriptografi yang betul berdasarkan keperluan aplikasi anda.

Perlukan lebih banyak ilmu?

Baca lebih lanjut tentang Kunci Dikongsi
Baca lebih lanjut tentang Kunci Awam
Baca lebih lanjut tentang SHA-256
Baca lebih lanjut di SHA-3
Baca lebih lanjut di MD5
Baca lebih lanjut di SHA-1
Baca lebih lanjut tentang penyulitan simetri
Baca lebih lanjut tentang AES

Terima kasih kerana membaca, beritahu saya pendapat anda tentang perkara ini dan jika anda ingin melihat lebih lanjut, jika anda rasa saya melakukan kesilapan atau terlepas sesuatu, jangan teragak-agak untuk mengulas

Atas ialah kandungan terperinci Kriptografi dalam JavaScript: Panduan Praktikal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan