203 lượt xem

Thư viện mã hóa đơn giản trong Node.js với Typescript


Cách mã hóa và mã hóa dữ liệu đơn giản


Ảnh của Fidel Fernando trên Unsplash
Trong một dự án Bất Động Sản mà tôi đã làm cách đây một thời hạn, tôi đã gặp phải một yếu tố không mấy độc lạ. Nó tương quan đến cách chúng tôi hoàn toàn có thể chuyển một cách bảo đảm an toàn thông tin người dùng hoàn toàn có thể nhận dạng như số điện thoại thông minh được mã hóa và mã hóa bởi dịch vụ bên thứ ba trong Ruby, để được giải thuật và giải thuật vào ứng dụng của chúng tôi cho người dùng .

//Link with encrypted token
https://example.com?token=XXXXX


Ảnh của Austin Distel trên Unsplash
Trong trường hợp này, cả hai chúng tôi đã san sẻ cùng một khóa mã hóa, một quy trình được gọi là https://en.wikipedia.org/wiki/Symmetric-key_algorithm. Điều này có nghĩa là phải sử dụng cùng một khóa mã hóa để giải thuật tài liệu .

Trong dự án đó và một số ứng dụng, nơi chúng tôi muốn mã hóa và mã hóa dữ liệu nhạy cảm, chúng tôi cũng cần có khả năng giải mã và giải mã thông tin này, khi chúng tôi cần, ở bất kỳ đâu trong ứng dụng của chúng tôi, sao cho giá trị được giải mã không bị thay đổi trong quá trình đảm bảo https://digitalguardian.com/blog/what-data-integrity-data-protection-101. Bản chất:

const value = 0123456789 // Initial value
const token = encrypt(value) // Encrypted token
const decryptedValue = decrypt(token) // Decrypted value
value === decryptedValue // Must be TRUE
  • https://www.typescriptlang.org/ – thêm các định nghĩa được nhập tĩnh vào JavaScript
  • https://en.wikipedia.org/wiki/Symmetric-key_algorithm – kỹ thuật mã hóa mật mã sử dụng các khóa mã hóa giống nhau cho cả mã hóa và giải mã dữ liệu
  • https://nodejs.org/api/crypto.html – mô-đun Node.js tích hợp cung cấp chức năng mật mã
  • https://nodejs.org/api/buffer.html- lớp con của lớp JavaScript Uint8Arrayđược sử dụng để mã hóa và giải mã ký tự
  • Kiểm tra bằng cách sử dụng https://mochajs.org/ và https://www.chaijs.com/
  • Kiểm tra tự động, quản lý phiên bản và xuất bản gói bằng cách sử dụng https://github.com/, https://circleci.com/ và https://github.com/semantic-release/semantic-release


Ảnh của Fotis Fotopoulos trên Unsplash

Bạn cũng cần phải có npmvà / hoặc yarncài đặt toàn cầu. Xem cáchhttps://classic.yarnpkg.com/en/docs/install/ và https://docs.npmjs.com/downloading-and-installing-node-js-and-npm. Tôi cũng thích sử dụnghttps://github.com/nvm-sh/nvm#installing-and-updating để quản lý các phiên bản Node của tôi.

Tiếp theo, chúng tôi tạo thư mục dự án Bất Động Sản của mình và thiết lập bản ghi :

$ mkdir encrypt-decrypt-library
$ cd encrypt-decrypt-library
$ yarn init -y
$ yarn add -D typescript
// TypeScript execution for node
$ yarn add -D ts-node @types/node
$ yarn tsc --init --rootDir src --outDir dist

Tiếp theo, tất cả chúng ta cần thiết lập 1 số ít gói bổ trợ cho thư viện của mình. Lưu ý rằng NPM của https://www.npmjs.com/package/crypto mô-đun đã không được dùng nữa vì nó hiện là một mô-đun Node tích hợp sẵn. Mô-đun này phân phối cho chúng tôi những tính năng mật mã như hàm băm, mật mã, giải thuật, ký, xác định và HMAC của OpenSSL .
Chúng tôi sẽ sử dụng https://nodejs.org/api/buffer.html lớp để viết và đọc những số nguyên 64 – bit không dấu vì JavaScript có https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER 53 bit và thư viện của chúng tôi phải có năng lực giải quyết và xử lý endian lớn 64 bit, đặc biệt quan trọng khi chúng tôi cần mã hóa và giải thuật những số nguyên lớn như số điện thoại thông minh .

Chúng tôi cũng cần cài đặt https://www.npmjs.com/package/dotenvđể tải các biến môi trường từ .envtệp vào process.env.

$ yarn add -D dotenv
$ mkdir src
$ touch src/encryption.ts
$ touch .env .env.example .gitignore
    




Trên trình duyệt, Javascript cung cấp hai chức năng để giải mã và mã hóa chuỗi base64, btoa()atob()xemhttps://developer.mozilla.org/en-US/docs/Glossary/Base64. Khi mã của chúng tôi chạy bên ngoài trình duyệt và do các vấn đề liên quan đến mã hóa và giải mã UTF-16-bithttps://developer.mozilla.org/en-US/docs/Web/API/DOMString, chúng tôi sẽ mã hóa và giải mã Số nguyên lớn 64-bit thành Số byte cuối lớn và ngược lại bằng cách sử dụng https://nodejs.org/api/buffer.htmllớp bao gồm writeBigUInt64BE()readBigUInt64BE()các phương thức:

// allocate Buffer instance
const buf = Buffer.allocUnsafe(8);
// Write value to Buffer instance at the specified offset as big-endian.
buf.writeBigUInt64BE(BigInt(value));
// Read an unsigned, big-endian 64-bit integer from the Buffer instance at the specified offset
// and returns as a string
buf.readBigUInt64BE(0).toString();

Đối với điều này, chúng tôi sử dụng Node tích hợp https://nodejs.org/api/crypto.html và thực hiện https://nodejs.org/api/crypto.html#crypto_crypto_createcipheriv_algorithm_key_iv_optionsvà https://nodejs.org/api/crypto.html#crypto_crypto_createdecipheriv_algorithm_key_iv_optionscác phương thức để tạo và trả về một CipherDeciphercá thể tương ứng bằng cách sử dụng các tham số sau:

  • algorithm – thuật toán cơ bản đang được sử dụng, dựa trên OpenSSL
  • key – khóa thô được sử dụng bởi thuật toán
  • iv – https://en.wikipedia.org/wiki/Initialization_vector

Cả chúng tôi encrypt()decrypt()phương pháp đều sử dụnghttps://en.wikipedia.org/wiki/Symmetric-key_algorithm các thuật toán, đảm bảo rằng cùng một khóa mã hóa được sử dụng để mã hóa dữ liệu phải được sử dụng để giải mã nó. https://www.cryptomathic.com/news-events/blog/symmetric-encryption-algorithms-their-strengths-and-weaknesses-and-the-need-for-crypto-agility Tiếp theo, chúng ta cần thêm một số thử nghiệm vào thư viện của mình.

Kiểm tra

Để thêm những bài kiểm tra vào thư viện của chúng tôi, chúng tôi cần thiết lập một số ít phụ thuộc vào đơn cử là https://mochajs.org/ và https://www.chaijs.com/ :

$ yarn add -D mocha @types/mocha chai @types/chai
$ mkdir tests
$ touch tests/encryption.test.ts

Các ALGORITHM, ENCRYPTION_KEYSALTlà các biến môi trường thiết lập trong chúng tôi. envtập tin.

Tiếp theo, chúng ta cần cập nhật thuộc scriptstính trong của chúng ta package.jsonbằng testlệnh:

// package.json
"scripts": {
  "test": "./node_modules/.bin/mocha \"tests/**/*.ts\" --require ts-node/register --require dotenv/config"
},

Chúng tôi chạy thử nghiệm bằng cách sử dụng các đối số Node CLI – yêu cầu Mocha ts-nodeđể chúng tôi có thể thực thi tệp kiểm tra Typecript mà không cần biên dịch chúng. Chúng tôi đăng ký ts-nodetrình nạp bằng cách sử dụng ts-node/register. Chúng tôi cũng chỉ định đường dẫn đến các tệp thử nghiệm. Nó sẽ chạy mọi tệp thử nghiệm trong teststhư mục phù hợp với mẫu. Nó cũng yêu cầu dotenv/config, cho phép chúng tôi sử dụng các biến được đặt trong .envtệp của chúng tôi .

Để bắt đầu kiểm tra, chúng tôi chỉ cần chạy trong dòng lệnh yarn run test.

$ yarn run test
yarn run v1.22.4
$ ./node_modules/.bin/mocha "tests/**/*.ts" --require ts-node/register --require dotenv/config
Encryption
    Ensuring encrypting and decrypting of string and number
      ✓ should encrypt and decrypt the string correctly
      ✓ should encrypt and decrypt the number as a big integer correctly
      ✓ should encrypt and decrypt the number as a string correctly
    Ensure decrypting of Big Integer token into a valid number
      ✓ should decrypt the encoded slug to a Big Integer correctly
    Ensure decrypting of string token into a valid string or number
      ✓ should decrypt the encoded slug to a valid string correctly
    Ensure decrypting of an 8-byte Big integer token into a valid number
      ✓ should decrypt the encoded slug to a Big Integer correctly
    Ensure validation of encrypt or decrypt methods 
      ✓ should return an error message if encrypt has no value
      ✓ should return an error message if decrypt has no value
    Ensure validation of library with no configuration
      ✓ should fail to encrypt the string correctly
      ✓ should fail to decrypt the string correctly
10 passing (25ms)

Để đảm bảo chúng ta có một quy ước mã hóa rõ ràng và nhất quán trong thư viện của mình, điều quan trọng là phải thêm linting. Linting giúp phát triển bằng cách thực thi kiểu mã, xác định, báo cáo và sửa bất kỳ sự mâu thuẫn và lỗi nào trong mã của chúng tôi. Đối với thư viện Mã hóa của chúng tôi, tôi đã chọn sử dụnghttps://eslint.org/ vì nó hỗ trợ cả JavaScript và TypeScript.

Đầu tiên, hãy thiết lập toàn bộ những nhờ vào nhà tăng trưởng được nhu yếu :

  • https://www.npmjs.com/package/eslint – Thư viện linting ESLint
  • https://www.npmjs.com/package/@typescript-eslint/parser – Trình phân tích cú pháp TypeScript cho ESLint
  • https://www.npmjs.com/package/@typescript-eslint/eslint-plugin – Một plugin với các quy tắc ESLint cụ thể của TypeScript
// Install ESLint and plugins
$ yarn add -D eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin

– tắt các quy tắc ESLint có thể xung đột với các quy tắc đẹp hơn
https://www.npmjs.com/package/prettier – thư viện đẹp hơn cốt lõi https://www.npmjs.com/package/eslint-config-prettier – tắt các quy tắc ESLint có thể xung đột với các quy tắc đẹp hơn https://www.npmjs.com/package/eslint-plugin-prettier – chạy Prettier như một quy tắc ESLint

// Install Prettier and plugins
$ yarn add -D prettier eslint-config-prettier eslint-plugin-prettier
// Installs husky and lint
$ yarn add -D husky lint-staged
$ npx eslint --init


ESLint init

Tiếp theo, tạo một tệp thông báo cho ESLint biết các thư mục hoặc tệp cần bỏ qua và thêm thông tin sau:.eslintignore

node_modules
dist
tests
coverage
styleguide.config.js
src/**/*.test.tsx
src/**/*.md
src/serviceWorker.ts
// package.json
"scripts": {
  ...
  "lint": "eslint 'src/**/*.{js,ts}' --quiet --fix"
},

Để định cấu hình lint-stagedhusky, chúng tôi cũng thêm cấu hình sau vào package.json:

// package.json
"husky": {
  "hooks": {
    "pre-commit": "lint-staged"
  }
},
"lint-staged": {
  "src/**/*.{js,ts}": [
    "prettier --single-quote --write",
    "eslint --fix"
  ]
},


Husky -pre-commit

Sản xuất

Để sử dụng thư viện Mã hóa của chúng tôi dưới dạng mô-đun NPM, chúng tôi cần xuất lớp Mã hóa của mình và sau đó biên dịch những tệp Typecript của chúng tôi thành JavaScript .

Đầu tiên, chúng tôi tạo tệp xuất index.tstrong srcthư mục của chúng tôi như sau:

$ touch src/index.ts
import Encryption from "./encryption";

export default Encryption;
// package.json
"scripts": {
  ...
  "build": "NODE_ENV=production tsc"
},

Chúng ta cũng cần cài đặt rimrafphụ thuộc dev, hoạt động giống như rm -rflệnh.

$ yarn add -D rimraf
// package.json
"scripts": {
  ...
  "build": "rimraf ./dist && NODE_ENV=production tsc"
},
......
"main": "dist/index.js",
"module": "dist/index.js",
"types": "dist/index.d.ts"

Tài liệu

Điều quan trọng là gồm có tài liệu đáng an toàn và đáng tin cậy để giúp chúng tôi theo dõi những góc nhìn khác nhau của một ứng dụng. Nó giúp cải tổ chất lượng của mã và giúp việc tăng trưởng, bảo dưỡng và chuyển giao kiến ​ ​ thức thuận tiện hơn .

Tiếp theo, chúng ta cần tạo một README.mdtệp ở gốc của dự án:

$ touch README.md

Xuất bản

Trước khi có thể xuất bản thư viện của mình, chúng tôi muốn loại trừ các tệp nhất định khỏi gói cuối cùng của mình. Chúng tôi sẽ làm điều này bằng cách thêm một thuộc filestính vào của chúng tôi package.json, điều này cho biếthttps://www.npmjs.com/đó filesvà / hoặc directoriesđể bao gồm trong gói phần mềm của chúng tôi:

// package.json
"files": [ "dist" ],
// .npmignore
src
node_modules
tests
.idea
coverage


npm xuất bản CLI

Quy trình làm việc tự động

Điều quan trọng là chúng tôi phải tự động hóa quy trình tiến độ phát hành vì điều này giúp tiết kiệm ngân sách và chi phí thời hạn và cải tổ chất lượng mã. Nó được cho phép chúng tôi hoàn toàn có thể tự động hóa những bước khác nhau ở trên, ví dụ điển hình như setup những phần phụ thuộc, linting, kiểm tra, lập phiên bản và xuất bản thư viện của chúng tôi lên NPM .

Vui lòng xem bài viết của tôi, Cách tự động hóa tích hợp và phát triển liên tục, tạo phiên bản và xuất bản để biết hướng dẫn từng bước về cách thiết lập CI / CD bằng Github, CircleCI và Semantic Release để tự động hóa quy trình công việc của bạn bao gồm tự động hóa thử nghiệm, in linting, lập phiên bản, triển khai và xuất bản lên NPM.

Huy hiệu trạng thái

Chúng tôi hoàn toàn có thể cần gồm có huy hiệu thiết kế xây dựng trong dự án Bất Động Sản của mình để cung ứng quyền truy vấn công khai minh bạch vào trạng thái thiết kế xây dựng của gói của chúng tôi. Các huy hiệu trạng thái hoàn toàn có thể được nhúng ở đầu tệp README của dự án Bất Động Sản .
Chúng tôi sẽ thêm huy hiệu trạng thái CircleCI và Semantic Release ở đầu tệp README của dự án Bất Động Sản của chúng tôi. Xem https://circleci.com/docs/2.0/status-badges/ .

# CircleCI Template: 
[![CircleCI](https://circleci.com///.svg?style=svg)]()
# Semantic Release Template: 
[![semantic-release](https://badge.fury.io/js/.svg?style=svg)]()
// CircleCI Build Status
[![CircleCI](https://circleci.com/gh/s-barrah/encrypt-decrypt-library.svg?style=svg)](https://app.circleci.com/pipelines/github/s-barrah/encrypt-decrypt-library)
// Semantic Release 
[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)
// NPM Status
[![semantic-release](https://badge.fury.io/js/encrypt-decrypt-library.svg)](https://www.npmjs.com/package/encrypt-decrypt-library)


Status Badges

Để sử dụng thư viện của chúng tôi trong bất kỳ dự án nào, hãy cài đặt bằng cách sử dụng YARNhoặc NPM:

// Via Yarn
$ yarn add encrypt-decrypt-library
// Via NPM
$ npm install --save encrypt-decrypt-library
import Encryption from "encrypt-decrypt-library";
const config = {
   algorithm: process.env.ALGORITHM,
   encryptionKey: process.env.ENCRYPTION_KEY,
   salt: process.env.SALT,
} 
const encryption = new Encryption(config);
// Encrypt a string
encryption.encrypt('Hello world')
// Encrypted as an unsigned 64-bit Integer
encryption.encrypt(123, true)
// Encrypted as string
encryption.decrypt('gmmBh17Q4QA=')

// Encrypted as an integer
encryption.decrypt('NF1r855MimY=', true)

Có nhiều lý do tại sao chúng ta có thể cần mã hóa và giải mã dữ liệu. Chúng tôi có thể muốn chuyển thông tin nhạy cảm dưới dạng tham số URL và muốn nó được làm xáo trộn khỏi người dùng. Mã hóa Base64 có thể tạo mã thông báo URL ngắn và thân thiện với SEO và trong Node, các thư viện như atobbtoacó thể mô phỏng chức năng của trình duyệt, tuy nhiên, mã hóa Base64 không an toàn. Bạn có thể đọc thêm vềhttps://developer.mozilla.org/en-US/docs/Glossary/Base64.

Mục đích của bài viết này là để chứng minh cách tạo một thư viện mã hóa đơn giản và dễ sử dụng có thể được nhập và sử dụng trong bất kỳ dự án nào của chúng tôi để mã hóa và mã hóa các chuỗi và số đơn giản thành các tham số URL ngắn gọn, an toàn và thân thiện với SEO .

Có 1 số ít thư viện NPM phân phối mã hóa và mã hóa như https://www.npmjs.com/package/crypto-js. Bạn cũng hoàn toàn có thể tò mò điều này https://gist.github.com/jo/8619441 và quyết định hành động những gì tương thích với trường hợp sử dụng của bạn .
Vui lòng sao chép, phân nhánh hoặc gắn dấu sao cho thư viện Mã hóa Đơn giản của tôi Kho tàng trữ GitHub bên dưới nếu nó giúp bạn :

Đọc thêm

  • https://www.cryptomathic.com/news-events/blog/symmetric-key-encryption-why-where-and-how-its-used-in-banking
  • https://www.cryptomathic.com/news-events/blog/differences-between-hash-functions-symmetric-asymmetric-algorithms
  • https://developer.mozilla.org/en-US/docs/Web/API/Crypto
  • https://github.com/typescript-eslint/typescript-eslint
  • https://www.robertcooper.me/using-eslint-and-prettier-in-a-typescript-project
  • https://developer.mozilla.org/en-US/docs/Web/API/DOMString/Binary
  • https://blog.bigbinary.com/2011/07/20/ruby-pack-unpack.html
  • Mật mã khóa công khai, tốc độ cao trong JavaScript

Source: https://trade.edu.vn
Category: Blockchain

Vote sao

Trả lời

Email của bạn sẽ không được hiển thị công khai.