Mã hóa dữ liệu json trong javascript

Gần đây, tôi bắt đầu tương tác với chương trình phụ trợ của dự án chỉ chấp nhận dữ liệu được mã hóa — nghĩa là, văn bản gốc được chuyển đổi thành văn bản mã hóa trước khi nó được gửi đến chương trình phụ trợ. Trên phần phụ trợ, bản mã sau đó được giải mã trở lại bản rõ. Phần phụ trợ được viết bằng Java, vì vậy tôi đã nghĩ về cách thực hiện điều này bằng Node. js

Vì tôi chưa từng làm một việc như vậy trước đây nên tôi phải thực hiện một số nghiên cứu để xem việc này được thực hiện như thế nào. Một khi tôi phát hiện ra điều mình đang tìm kiếm, tôi phải kiểm tra những phát hiện của mình. Và cách nhanh nhất để kiểm tra API mà không cần tạo giao diện người dùng là với Postman

Theo BlazeMeter, Postman là một ứng dụng khách API phổ biến giúp các nhà phát triển dễ dàng tạo, chia sẻ, kiểm tra và lập tài liệu API. Điều này được thực hiện bằng cách cho phép người dùng tạo và lưu các yêu cầu HTTP/s đơn giản và phức tạp, cũng như đọc phản hồi của họ. Kết quả — công việc hiệu quả hơn và ít tẻ nhạt hơn

Mặc dù đã có kinh nghiệm với Postman nhưng tôi vẫn chưa biết cách mã hóa dữ liệu trước khi thực hiện yêu cầu. Vì vậy, tôi bắt đầu một vòng nghiên cứu khác và tình cờ thấy một tab trên Postman có tên **Pre-request Script. **Như tên ngụ ý, đó là một tập lệnh chạy ngay trước khi yêu cầu được gửi

Mã hóa dữ liệu json trong javascript
Tab gạch chân màu cam

Ngoài ra, Postman được cài đặt sẵn một số gói JavaScript phổ biến và các gói này có thể được sử dụng trong Pre-request Script để thao tác dữ liệu. Một trong những gói đó là gói mà chúng tôi sẽ sử dụng để mã hóa dữ liệu trên Tập lệnh yêu cầu trước. Bây giờ hãy xem cách mã hóa dữ liệu bằng thông số AES trong mã bên dưới

var CryptoJS = require("crypto-js");

// Generate random 16 bytes to use as IV
var IV = CryptoJS.lib.WordArray.random(16);

var keyString = "TyJk8w3KsvKEekRs";
// finds the SHA-256 hash for the keyString
var Key = CryptoJS.SHA256(keyString);

function encrypt(data) {
  var val = CryptoJS.enc.Utf8.parse(JSON.stringify(data));
  var encrypted = CryptoJS.AES.encrypt(val, Key, { iv: IV }).toString();
  var b64 = CryptoJS.enc.Base64.parse(encrypted).toString(CryptoJS.enc.Hex);
  return b64;
}

var data = { data: "how to send encrypted data" };

// Set local variables to postman
pm.variables.set("encrypted", encrypt(data));
pm.variables.set("IV", IV.toString());

Tôi sẽ cho rằng bạn đã mở Postman. Vì vậy, hãy điều hướng đến tab **Tập lệnh yêu cầu trước ** và sao chép-dán mã ở trên vào đó. Bây giờ, hãy bước qua mã

Chúng tôi chỉ yêu cầu crypto-js trên dòng 1 vì gói tồn tại trên Postman. Và đối với mã hóa AES (AES256 theo mặc định), chúng tôi cần khóa 32 byte (256 bit) và iv 16 byte (128 bit), vì vậy trên dòng 4, chúng tôi tạo 16 byte ngẫu nhiên để sử dụng làm IV(Vectơ khởi tạo

Các vectơ khởi tạo phải không thể đoán trước và duy nhất, thường được yêu cầu là ngẫu nhiên hoặc giả ngẫu nhiên —

Trên dòng 8, chúng tôi tìm thấy hàm băm sha-256 của chuỗi khóa, giá trị này trả về 32 byte (256 bit) được sử dụng làm khóa. Bây giờ chúng ta có khóa và iv , chúng ta chuyển sang chức năng mã hóa. Trên dòng 11 , trước tiên chúng tôi chuyển đổi dữ liệu, sẽ là một đối tượng, thành một chuỗi có JSON. stringify, sau đó chúng tôi chuyển đổi chuỗi kết quả thành a để AES. phương pháp mã hóa sẽ có thể xử lý nó

Từ dòng 12 đến 14 , chúng tôi chuyển khóa, iv và val (hiện là một mảng từ) vào phương thức mã hóa AES và cuối cùng chuyển đổi nó thành base64 và hoàn thành việc khai báo hàm mã hóa

Bây giờ, đã đến lúc chúng ta sử dụng hàm mã hóa và đó là những gì chúng ta làm ở dòng 20, dữ liệu JSON ở dòng 17 sẽ là dữ liệu yêu cầu thô của chúng ta, được chuyển làm đối số cho hàm mã hóa và kết quả là chuỗi 64 cơ sở . Ngoài ra, IV (Vectơ khởi tạo) phải được chuyển đến phụ trợ và đó là những gì chúng tôi làm trên dòng 21, IV được chuyển đổi thành một chuỗi và sau đó được đặt trên một biến cục bộ Postman khác có tên là “IV”

Điều này sau đó đưa chúng tôi đến phần hoàn thành Tập lệnh yêu cầu trước của chúng tôi. Bây giờ hãy xem cách chúng ta sẽ sử dụng 2 biến cục bộ Postman (“được mã hóa” và “IV”) trong phần thân yêu cầu

Đầu tiên, chúng ta chuyển sang tab body trên Postman và đặt định dạng dữ liệu thành JSON

Mã hóa dữ liệu json trong javascript
tab cơ thể trên người đưa thư

Sau đó, chúng tôi thêm phần thân yêu cầu và truy cập các biến cục bộ Postman từ tập lệnh yêu cầu trước của chúng tôi bằng cách gói tên biến trong dấu ngoặc nhọn kép như vậy {{variable_name}}. Chúng tôi có hai biến cục bộ trong tập lệnh yêu cầu trước (“được mã hóa” và “IV”). Hãy xem cách chúng tôi truy cập chúng bên dưới

{

   "encrypted": "*{{encrypted}}*",

   "IV": "*{{IV}}*"

}

Trong đoạn mã trên, chúng ta truy cập giá trị biến cục bộ “được mã hóa” bằng cách gói nó trong dấu ngoặc nhọn kép(*{{encrypted}}) *và sau đó đặt nó thành khóa JSON có tên là “encrypted” (có thể đặt tên cho khóa JSON . Điều tương tự cũng được thực hiện đối với biến cục bộ “IV”. Bây giờ chúng tôi đã sẵn sàng gửi dữ liệu được mã hóa từ Postman nhưng chúng tôi không có chương trình phụ trợ để nhận dữ liệu đó. Hãy khắc phục điều đó

nút của chúng tôi. js phụ trợ đã được thiết lập trên CodeSandbox. Bây giờ chúng ta hãy xem qua những gì đang xảy ra ở đó

Chúng tôi sẽ sử dụng Node tích hợp. js để giải mã và express để xử lý (các) yêu cầu HTTP. Điểm quan tâm tiếp theo của chúng tôi là Trình xử lý giải mã, chúng tôi là phần thân yêu cầu (req. body) và rút các khóa “được mã hóa” và “IV” khỏi nó. Tiếp theo, chúng tôi tìm hàm băm sha256 của biến “keyString”(giống như keyString được sử dụng trên Postman), điều này tương đương với những gì chúng tôi đã làm với crypto-js trên tập lệnh yêu cầu trước của Postman, nhưng trong trường hợp này, chúng tôi nhận được 32 . phương thức createDecipheriv()

Tiếp theo, chúng tôi chuyển đổi IV và dữ liệu được mã hóa thành bộ đệm và chuyển chúng vào các phương thức tương ứng, sau đó chạy giải mã. Bạn có thể đọc về cách giải mã hoạt động. Bây giờ điều cuối cùng chúng ta làm là thêm một thuộc tính bổ sung vào đối tượng trước khi trả về phản hồi để xác minh rằng yêu cầu được giải mã trên phần phụ trợ

Cuối cùng, chúng tôi cần một cách để kết nối với CodeSandbox từ Postman và điều đó sẽ được thực hiện thông qua URL trình duyệt của CodeSandbox. Trong trường hợp của tôi, đó là https. //m98ph. sse. mã hộp cát. io, sau đó tên tuyến đường cho trình xử lý giải mã là /decrypt, có nghĩa là URL cuối cùng được sử dụng trên Postman sẽ là https. //m98ph. sse. mã hộp cát. io/giải mã. Bây giờ Postman sẽ trông giống như thế này

Mã hóa dữ liệu json trong javascript
người đưa thư chỉ vào mã và hộp

Tất cả những gì còn lại bây giờ là gửi yêu cầu POST và chúng ta sẽ nhận được phản hồi giống như thế này

Mã hóa dữ liệu json trong javascript
phản hồi giải mã

tiếng hoan hô. Chúng tôi đã mã hóa thành công dữ liệu, gửi đến máy chủ, giải mã, thao tác và gửi lại phản hồi. Hy vọng, bạn đã nhận được phản hồi tương tự như thế này. Nếu không, bạn có thể quay lại và xem nơi bạn có thể đã bỏ lỡ điều gì đó

Bản tóm tắt

Tóm lại, chúng ta đã thấy cách tạo Tập lệnh yêu cầu trước trên Postman, cách đặt giá trị cho biến cục bộ Postman và cách sử dụng biến cục bộ trên phần thân yêu cầu. Chúng tôi cũng đã học cách mã hóa bằng crypto-js ở phía máy khách và giải mã bằng Node. mô-đun mật mã js ở phía máy chủ

Ngoài ra, chúng tôi đã thấy cách chúng tôi có thể sử dụng CodeSandbox làm máy chủ phía máy chủ, điều này khá tuyệt vời nếu bạn hỏi tôi

Tài liệu tham khảo và liên kết hữu ích

  • Cách sử dụng mô-đun tiền điện tử — https. //nodejs. org/vi/kiến thức/mật mã/cách sử dụng-mô-đun mật mã

  • Hướng dẫn về Crypto-js —

  • Cách sử dụng Người đưa thư — https. //www. đo lửa. com/blog/how-use-postman-manage-and-execute-your-apis

  • Sử dụng biến Postman — https. //học tập. người phát thơ. com/docs/gửi yêu cầu/biến/

**P. S. — ** Xin đừng ngần ngại gửi câu hỏi và đề xuất của bạn bên dưới. Bạn cũng có thể liên hệ với tôi trên Twitter nếu bạn muốn hỏi tôi một cách cá nhân hoặc kết nối