Giới thiệu
Thư viện crypto trong Node.js cung cấp các phương thức mã hóa và giải mã, cho phép chúng ta bảo vệ thông tin nhạy cảm. Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng thư viện này để mã hóa và giải mã dữ liệu bằng cách sử dụng thuật toán AES-GCM.
Mục lục
- Cài đặt
- Cấu trúc mã nguồn
- Sử dụng thư viện crypto
- Thực hiện mã hóa
- Giải mã dữ liệu
- Thực tiễn tốt nhất
- Những cạm bẫy thường gặp
- Mẹo hiệu suất
- Khắc phục sự cố
- Câu hỏi thường gặp
- Kết luận
Cài đặt
Để bắt đầu, bạn cần cài đặt Node.js trên máy tính của mình. Sau khi cài đặt xong, bạn có thể tạo một dự án mới và cài đặt thư viện crypto:
bash
npm init -y
Chúng ta không cần cài đặt thư viện crypto, vì nó đã được tích hợp sẵn trong Node.js.
Cấu trúc mã nguồn
Dưới đây là cấu trúc mã nguồn cho chương trình mã hóa và giải mã mà chúng ta sẽ triển khai:
javascript
#!/usr/bin/env node
const crypto = require('crypto');
const fs = require('fs').promises;
const path = require('path');
// Các thông số cho mã hóa
const PBKDF2_ITER = 120_000; // Số lần lặp (có thể điều chỉnh)
const KEYLEN = 32; // Khóa 256-bit
const SALT_LEN = 16;
const IV_LEN = 12; // Khuyến nghị cho GCM
const AUTH_TAG_LEN = 16;
Sử dụng thư viện crypto
Thư viện crypto cung cấp nhiều hàm để thực hiện các thao tác mã hóa. Chúng ta sẽ sử dụng pbkdf2Sync để tạo khóa từ mật khẩu và createCipheriv để thực hiện mã hóa.
Thực hiện mã hóa
Dưới đây là hàm mã hóa dữ liệu:
javascript
function encryptBuffer(plainBuf, password) {
const salt = crypto.randomBytes(SALT_LEN);
const key = deriveKey(password, salt);
const iv = crypto.randomBytes(IV_LEN);
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv, { authTagLength: AUTH_TAG_LEN });
const ct = Buffer.concat([cipher.update(plainBuf), cipher.final()]);
const tag = cipher.getAuthTag();
const out = {
v: 1,
salt: salt.toString('base64'),
iv: iv.toString('base64'),
tag: tag.toString('base64'),
ct: ct.toString('base64'),
};
return JSON.stringify(out);
}
Ví dụ thực tế
Giả sử bạn muốn mã hóa một chuỗi văn bản:
bash
node secret-encode.js encrypt "my secret text" myPassword
Kết quả sẽ là một chuỗi JSON chứa thông tin mã hóa.
Giải mã dữ liệu
Hàm giải mã sẽ lấy chuỗi JSON đã mã hóa và mật khẩu để khôi phục dữ liệu gốc:
javascript
function decryptString(encryptedJsonStr, password) {
let obj;
try {
obj = JSON.parse(encryptedJsonStr);
} catch (e) {
throw new Error('Input is not valid JSON.');
}
if (obj.v !== 1) throw new Error('Unsupported version');
const salt = Buffer.from(obj.salt, 'base64');
const iv = Buffer.from(obj.iv, 'base64');
const tag = Buffer.from(obj.tag, 'base64');
const ct = Buffer.from(obj.ct, 'base64');
const key = deriveKey(password, salt);
const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv, { authTagLength: AUTH_TAG_LEN });
decipher.setAuthTag(tag);
const plain = Buffer.concat([decipher.update(ct), decipher.final()]);
return plain;
}
Thực tiễn tốt nhất
- Bảo mật mật khẩu: Đảm bảo rằng mật khẩu không được chia sẻ công khai, hãy sử dụng kênh an toàn để gửi mật khẩu.
- Kiểm tra đầu vào: Luôn kiểm tra dữ liệu đầu vào để tránh lỗi khi giải mã.
Những cạm bẫy thường gặp
- Lỗi định dạng JSON: Đảm bảo chuỗi JSON được truyền vào hàm giải mã phải đúng định dạng.
- Sai mật khẩu: Nếu mật khẩu không chính xác, việc giải mã sẽ thất bại.
Mẹo hiệu suất
- Tăng số lần lặp PBKDF2: Tăng số lần lặp có thể làm chậm quá trình mã hóa nhưng tăng cường bảo mật.
- Sử dụng Buffer: Sử dụng Buffer để xử lý các tệp lớn thay vì chuỗi.
Khắc phục sự cố
Nếu bạn gặp lỗi, hãy kiểm tra thông báo lỗi và đảm bảo rằng bạn đã cung cấp đúng tham số. Sử dụng try...catch để xử lý lỗi một cách hiệu quả.
Câu hỏi thường gặp
-
Làm thế nào để mã hóa một tệp?
Bạn có thể sử dụng lệnh sau:bashnode secret-encode.js encrypt-file ./input.txt myPassword -
Tại sao mã hóa lại quan trọng?
Mã hóa giúp bảo vệ thông tin nhạy cảm khỏi việc bị truy cập trái phép.
Kết luận
Thư viện crypto trong Node.js là một công cụ mạnh mẽ để bảo vệ dữ liệu của bạn. Bằng cách áp dụng các phương pháp mã hóa và giải mã mà chúng ta đã thảo luận, bạn có thể bảo vệ thông tin nhạy cảm một cách an toàn. Hãy bắt đầu áp dụng ngay hôm nay để tăng cường bảo mật cho ứng dụng của bạn!
Hãy thử ngay và bảo vệ dữ liệu của bạn!