Trong bài viết này, chúng ta sẽ khám phá cách bảo vệ dữ liệu nhạy cảm bằng kỹ thuật mã hóa và băm trong ứng dụng Node.js Express. Chúng tôi sẽ đề cập đến các chủ đề sau:
- Giới thiệu về mã hóa và băm
- Mã hóa dữ liệu với Node.js Crypto Module
- Băm dữ liệu với Mô-đun tiền điện tử Node.js
- Triển khai Mã hóa và Băm trong Express
1. Giới thiệu về mã hóa và băm
Dữ liệu nhạy cảm, chẳng hạn như mật khẩu, thông tin cá nhân và chi tiết tài chính, phải luôn được bảo vệ khi lưu trữ hoặc truyền đi. Hai phương pháp phổ biến để bảo vệ dữ liệu nhạy cảm là mã hóa và băm.
Mã hóa là quá trình chuyển đổi dữ liệu thành mã bí mật để ngăn chặn truy cập trái phép. Nó sử dụng một khóa bí mật cho cả mã hóa và giải mã, đảm bảo rằng chỉ những bên được ủy quyền mới có thể truy cập dữ liệu. Mã hóa có thể đảo ngược, nghĩa là dữ liệu được mã hóa có thể được giải mã về dạng ban đầu.
Băm là hàm một chiều biến đổi dữ liệu thành chuỗi ký tự có kích thước cố định, thường là giá trị băm. Không giống như mã hóa, băm là không thể đảo ngược, nghĩa là không thể khôi phục dữ liệu gốc từ giá trị băm. Điều này làm cho hàm băm đặc biệt phù hợp để lưu trữ dữ liệu nhạy cảm như mật khẩu, vì ngay cả khi giá trị băm bị rò rỉ, dữ liệu gốc vẫn được bảo mật.
2. Mã hóa dữ liệu với Node.js Crypto Module
Node.js bao gồm một mô-đun tích hợp có tên là tiền điện tử cung cấp nhiều chức năng mã hóa, bao gồm cả mã hóa. Hãy xem cách sử dụng mô-đun mật mã để thực hiện mã hóa đối xứng bằng thuật toán AES-256-CBC.
Cài đặt phụ thuộc
Để sử dụng mô-đun tiền điện tử, trước tiên chúng ta phải cài đặt các phụ thuộc bắt buộc:
1 2 | <span class="token function">npm</span> <span class="token function">install</span> --save crypto |
Mã hóa và giải mã dữ liệu
Đây là một ví dụ minh họa cách mã hóa và giải mã dữ liệu bằng AES-256-CBC:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <span class="token keyword">const</span> crypto <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"crypto"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> secretKey <span class="token operator">=</span> crypto <span class="token punctuation">.</span> <span class="token function">randomBytes</span> <span class="token punctuation">(</span> <span class="token number">32</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> iv <span class="token operator">=</span> crypto <span class="token punctuation">.</span> <span class="token function">randomBytes</span> <span class="token punctuation">(</span> <span class="token number">16</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">encrypt</span> <span class="token punctuation">(</span> <span class="token parameter">text</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> cipher <span class="token operator">=</span> crypto <span class="token punctuation">.</span> <span class="token function">createCipheriv</span> <span class="token punctuation">(</span> <span class="token string">"aes-256-cbc"</span> <span class="token punctuation">,</span> secretKey <span class="token punctuation">,</span> iv <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">let</span> encrypted <span class="token operator">=</span> cipher <span class="token punctuation">.</span> <span class="token function">update</span> <span class="token punctuation">(</span> text <span class="token punctuation">,</span> <span class="token string">"utf8"</span> <span class="token punctuation">,</span> <span class="token string">"hex"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> encrypted <span class="token operator">+=</span> cipher <span class="token punctuation">.</span> <span class="token function">final</span> <span class="token punctuation">(</span> <span class="token string">"hex"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> encrypted <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">decrypt</span> <span class="token punctuation">(</span> <span class="token parameter">encrypted</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> decipher <span class="token operator">=</span> crypto <span class="token punctuation">.</span> <span class="token function">createDecipheriv</span> <span class="token punctuation">(</span> <span class="token string">"aes-256-cbc"</span> <span class="token punctuation">,</span> secretKey <span class="token punctuation">,</span> iv <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">let</span> decrypted <span class="token operator">=</span> decipher <span class="token punctuation">.</span> <span class="token function">update</span> <span class="token punctuation">(</span> encrypted <span class="token punctuation">,</span> <span class="token string">"hex"</span> <span class="token punctuation">,</span> <span class="token string">"utf8"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> decrypted <span class="token operator">+=</span> decipher <span class="token punctuation">.</span> <span class="token function">final</span> <span class="token punctuation">(</span> <span class="token string">"utf8"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> decrypted <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> originalText <span class="token operator">=</span> <span class="token string">"Sensitive data"</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> encryptedText <span class="token operator">=</span> <span class="token function">encrypt</span> <span class="token punctuation">(</span> originalText <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> decryptedText <span class="token operator">=</span> <span class="token function">decrypt</span> <span class="token punctuation">(</span> encryptedText <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Original Text:"</span> <span class="token punctuation">,</span> originalText <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Encrypted Text:"</span> <span class="token punctuation">,</span> encryptedText <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Decrypted Text:"</span> <span class="token punctuation">,</span> decryptedText <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
3. Băm dữ liệu với Node.js Crypto Module
Bây giờ hãy xem cách sử dụng mô-đun mật mã để băm dữ liệu bằng thuật toán SHA-256.
Băm dữ liệu
Đây là một ví dụ minh họa cách băm dữ liệu bằng SHA-256:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token keyword">const</span> crypto <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"crypto"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">hashData</span> <span class="token punctuation">(</span> <span class="token parameter">data</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> crypto <span class="token punctuation">.</span> <span class="token function">createHash</span> <span class="token punctuation">(</span> <span class="token string">"sha256"</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">update</span> <span class="token punctuation">(</span> data <span class="token punctuation">,</span> <span class="token string">"utf8"</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">digest</span> <span class="token punctuation">(</span> <span class="token string">"hex"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> data <span class="token operator">=</span> <span class="token string">"Sensitive data"</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> hashedData <span class="token operator">=</span> <span class="token function">hashData</span> <span class="token punctuation">(</span> data <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Data:"</span> <span class="token punctuation">,</span> data <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Hashed Data:"</span> <span class="token punctuation">,</span> hashedData <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
4. Triển khai Mã hóa và Băm trong Express
Bây giờ hãy xem cách tích hợp mã hóa và băm vào ứng dụng Express.
Cài đặt phụ thuộc
Đầu tiên, cài đặt các phụ thuộc cần thiết:
1 2 | <span class="token function">npm</span> <span class="token function">install</span> --save express body-parser crypto |
Thiết lập ứng dụng Express
Tạo một ứng dụng Express mới và bao gồm các mô-đun cần thiết:
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">const</span> express <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"express"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> bodyParser <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"body-parser"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> crypto <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"crypto"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token function">express</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> bodyParser <span class="token punctuation">.</span> <span class="token function">json</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> secretKey <span class="token operator">=</span> crypto <span class="token punctuation">.</span> <span class="token function">randomBytes</span> <span class="token punctuation">(</span> <span class="token number">32</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> iv <span class="token operator">=</span> crypto <span class="token punctuation">.</span> <span class="token function">randomBytes</span> <span class="token punctuation">(</span> <span class="token number">16</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Mã hóa dữ liệu trong Express Route
Tạo một tuyến mới để xử lý mã hóa dữ liệu được gửi trong yêu cầu POST:
1 2 3 4 5 6 7 8 9 10 11 | app <span class="token punctuation">.</span> <span class="token function">post</span> <span class="token punctuation">(</span> <span class="token string">"/encrypt"</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token parameter">req <span class="token punctuation">,</span> res</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> text <span class="token operator">=</span> req <span class="token punctuation">.</span> body <span class="token punctuation">.</span> text <span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span> text <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> res <span class="token punctuation">.</span> <span class="token function">status</span> <span class="token punctuation">(</span> <span class="token number">400</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> <span class="token string">"No data provided"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> encryptedText <span class="token operator">=</span> <span class="token function">encrypt</span> <span class="token punctuation">(</span> text <span class="token punctuation">)</span> <span class="token punctuation">;</span> res <span class="token punctuation">.</span> <span class="token function">status</span> <span class="token punctuation">(</span> <span class="token number">200</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> encrypted <span class="token operator">:</span> encryptedText <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Băm dữ liệu trong Express Route
Tạo một tuyến đường khác để xử lý băm dữ liệu được gửi trong yêu cầu POST:
1 2 3 4 5 6 7 8 9 10 11 | app <span class="token punctuation">.</span> <span class="token function">post</span> <span class="token punctuation">(</span> <span class="token string">"/hash"</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token parameter">req <span class="token punctuation">,</span> res</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> data <span class="token operator">=</span> req <span class="token punctuation">.</span> body <span class="token punctuation">.</span> data <span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span> data <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> res <span class="token punctuation">.</span> <span class="token function">status</span> <span class="token punctuation">(</span> <span class="token number">400</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> <span class="token string">"No data provided"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> hashedData <span class="token operator">=</span> <span class="token function">hashData</span> <span class="token punctuation">(</span> data <span class="token punctuation">)</span> <span class="token punctuation">;</span> res <span class="token punctuation">.</span> <span class="token function">status</span> <span class="token punctuation">(</span> <span class="token number">200</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> hash <span class="token operator">:</span> hashedData <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Khởi động máy chủ tốc hành
Cuối cùng, khởi động máy chủ Express và lắng nghe các yêu cầu đến:
1 2 3 4 5 | <span class="token keyword">const</span> <span class="token constant">PORT</span> <span class="token operator">=</span> process <span class="token punctuation">.</span> env <span class="token punctuation">.</span> <span class="token constant">PORT</span> <span class="token operator">||</span> <span class="token number">3000</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">listen</span> <span class="token punctuation">(</span> <span class="token constant">PORT</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token string">Server is running on port </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> <span class="token constant">PORT</span> <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token template-punctuation string">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Giờ đây, ứng dụng Express của bạn có thể nhận yêu cầu mã hóa và băm dữ liệu nhạy cảm.
Phần kết luận
Trong bài viết này, chúng ta đã khám phá cách bảo vệ dữ liệu nhạy cảm bằng mã hóa và băm trong ứng dụng Node.js Express. Bằng cách triển khai các kỹ thuật này, bạn có thể đảm bảo rằng dữ liệu của ứng dụng của mình vẫn an toàn và được bảo vệ khỏi truy cập trái phép.
Hãy nhớ rằng tính bảo mật của ứng dụng của bạn cũng phụ thuộc vào các yếu tố khác như lưu trữ an toàn khóa bí mật, kênh liên lạc an toàn và cơ chế kiểm soát truy cập phù hợp. Điều quan trọng là phải áp dụng một cách tiếp cận toàn diện về bảo mật để bảo vệ ứng dụng của bạn và người dùng của nó.
Và cuối cùng
Như mọi khi, tôi hy vọng bạn thích bài viết này và có một cái gì đó mới. Xin cảm ơn và hẹn gặp lại các bạn trong những bài viết tiếp theo!
Nếu các bạn thích bài viết này thì hãy cho mình 1 like và subscribe để ủng hộ mình nhé. Cảm ơn.