JavaScript có thể được mã hóa không?

Đây là post #24 của series, chuyên khám phá JavaScript và các thành phần xây dựng của nó. Trong quá trình xác định và mô tả các yếu tố cốt lõi, chúng tôi cũng chia sẻ một số quy tắc chung mà chúng tôi sử dụng khi xây dựng SessionStack, một ứng dụng JavaScript cần mạnh mẽ và có hiệu suất cao để giúp các công ty tối ưu hóa trải nghiệm kỹ thuật số của người dùng của họ

An ninh mạng là một lĩnh vực quan trọng trong lĩnh vực CNTT. Nhiều người giao tiếp với nhau hàng ngày từ khắp nơi trên thế giới thông qua internet. Khi mọi người giao tiếp qua internet, có khả năng những người khác có thể nghe lén hoặc thậm chí chiếm đoạt thông tin trước khi thông tin đó đến được với các bên liên quan khác. Ngoài ra, có khả năng dữ liệu cá nhân của người dùng bị đánh cắp bởi tin tặc khai thác các lỗ hổng trong mạng máy tính

Sau đó, làm cách nào để mọi người có thể gửi thông tin một cách an toàn qua internet và vai trò của JavaScript là gì?

Trong bài viết này, bạn sẽ tìm hiểu mật mã là gì, cách nó hoạt động trong JavaScript và cách đối phó với cuộc tấn công giữa chừng (MitM)

Giới thiệu về Mật mã học

Mật mã là quá trình bảo mật thông tin và liên lạc để chỉ người gửi và bên nhận dự định mới có thể truy cập chúng. Mật mã cấu thành các công nghệ khác nhau để bảo mật thông tin liên lạc đúng cách. Các công nghệ này có thể bao gồm mã hóa và giải mã bằng cách sử dụng mật mã và giải mã, sử dụng các thuật toán khác nhau để băm các quy trình truyền thông hoặc tạo và xác minh chữ ký

Vì nhiều người trò chuyện qua internet thông qua các ứng dụng di động được xây dựng bằng JavaScript, nên cần phải hiểu cách mã hóa hoạt động trong JavaScript. Trong phần tiếp theo, chúng ta sẽ xem API mã hóa web của JavaScript và cách nó hỗ trợ mã hóa

API mật mã web của JavaScript

Vì việc đảm bảo liên lạc an toàn qua internet là rất quan trọng nên một số trình duyệt web đã triển khai giao diện tiền điện tử. Tuy nhiên, giao diện này không được xác định rõ hoặc âm thanh mã hóa. API mã hóa web của JavaScript cung cấp một giao diện được xác định rõ ràng có tên là SubtleCrypto

API mã hóa web của JavaScript cho phép các nhà phát triển kết hợp các chức năng mã hóa cơ bản vào ứng dụng của họ mà không cần thư viện của bên thứ ba. Bạn có thể ký tài liệu, thực hiện xác thực và thực hiện kiểm tra tính toàn vẹn tổng thể của thông tin liên lạc

Ví dụ: bạn có thể lấy dữ liệu ngẫu nhiên được bảo mật bằng mật mã cho một mảng các số nguyên không dấu 8 bit bằng cách chạy các mã sau

Bạn có thể chạy mã này trên bảng điều khiển web của mình. Chẳng hạn, nếu tôi chạy mã này trên bảng điều khiển của Chrome, tôi sẽ nhận được đầu ra gồm mười số 8 bit được tạo ngẫu nhiên không có dấu

Hãy xem cách API mã hóa web của JavaScript hoạt động và cách chúng tôi có thể thực hiện điều này từ bảng điều khiển web của mình

Với API mã hóa web của JavaScript, máy chủ không thể xem dữ liệu vì nó được bảo mật bằng mật mã. Chỉ người gửi và người nhận mới có quyền truy cập vào dữ liệu liên lạc

Từ sơ đồ trên, bạn có thể thấy dữ liệu từ người gửi được mã hóa bằng API. Người nhận sử dụng khóa để giải mã dữ liệu, máy chủ và cơ sở dữ liệu không thể giải mã dữ liệu được mã hóa. Bạn có thể thực hiện các thao tác mật mã cơ bản như Băm, Tạo và xác minh chữ ký, Mã hóa và Giải mã sẽ được thảo luận thêm trong bài viết này

Các hàm mật mã cơ bản

Có rất nhiều chức năng mã hóa mà bạn có thể thực hiện với API mã hóa web của JavaScript. Trong phần này, chúng ta sẽ xem xét các chức năng mật mã cơ bản như Băm, Tạo và xác minh chữ ký, Mã hóa và Giải mã

mã hóa

Mã hóa là một trong những chức năng mật mã cơ bản. Trong mã hóa, một tin nhắn bằng ngôn ngữ của con người (bản rõ) được chuyển đổi thành ngôn ngữ máy tính (bản mã) bằng một khóa. Để người nhận hiểu được thông điệp từ người gửi, họ phải sử dụng một khóa

Quá trình mã hóa trong API mã hóa web của JavaScript sử dụng phương pháp encrypt. Phương thức encrypt có cú pháp như sau

Phương thức mã hóa sẽ trả về một Promise đáp ứng với một ArrayBuffer chứa “bản mã”. Tốt hơn là trả lại một Lời hứa mới bị từ chối với kết quả là nếu xảy ra lỗi trong quá trình mã hóa. Để hiểu rõ hơn về điều này, chúng tôi sẽ mã hóa một văn bản thuần túy bằng khóa và thuật toán AES-GCM. Sao chép mã bên dưới trong trình duyệt web của bạn và nhận thấy rằng đầu ra là một văn bản được mã hóa

Từ mã,

chỉ định khóa, trong khi

chỉ định thuật toán. hàm strToArrayBuffer chuyển đổi văn bản rõ thành văn bản mã hóa vì lời hứa được thực hiện cần phải là một ArrayBuffer với bản mã

giải mã

Giải mã là ngược lại của mã hóa. Trong giải mã, bản mã được chuyển đổi trở lại văn bản thuần túy. Để làm điều này, cần có khóa (tiền điện tử) từ người dùng được ủy quyền. Điều này giống như cố gắng truy cập vào một tòa nhà bị khóa bằng chìa khóa. Bạn sẽ không được phép vào tòa nhà chỉ vì bạn có một số chìa khóa. Cách duy nhất bạn sẽ được phép vào là nếu chìa khóa khớp (có thể mở tòa nhà)

Quá trình giải mã trong API mã hóa web của JavaScript sử dụng phương pháp decrypt. Dưới đây là cú pháp giải mã

Vì vậy, cú pháp giải mã từ bản mã ví dụ của chúng tôi được hiển thị bên dưới

Tuy nhiên, chúng tôi sẽ phải mã hóa và giải mã văn bản của mình khi các phương pháp này đi cùng nhau. Mã hoàn chỉnh để mã hóa và giải mã văn bản mẫu của chúng tôi được hiển thị bên dưới

Khi bạn chạy chương trình này, nó sẽ xuất ra bản rõ đã được mã hóa trước đó

Từ mã,

tạo khóa bí mật để giải mã tin nhắn

Quá trình mã hóa được chia thành mã hóa đối xứng và không đối xứng. Sự phân chia này phụ thuộc vào loại khóa dùng để giải mã. Đối với mã hóa đối xứng, cùng một khóa được sử dụng cho cả mã hóa và giải mã. Trong khi, đối với mã hóa bất đối xứng, các cặp khóa khác nhau được sử dụng để mã hóa và giải mã. Khóa công khai được chia sẻ bởi người dùng được ủy quyền được sử dụng để mã hóa trong khi khóa bí mật từ người nhận được sử dụng để giải mã. Chìa khóa bí mật được giữ bí mật bởi chủ sở hữu của họ

băm

Băm là một chức năng mật mã, cho phép bạn ánh xạ dữ liệu có kích thước tùy ý thành một mảng có kích thước cố định. Hàm băm mật mã chuyển đổi dữ liệu từ văn bản gốc thành một chuỗi số và bảng chữ cái duy nhất. Băm không giống như mã hóa, nó là chức năng một chiều. Điều này có nghĩa là rất khó và hầu như không thể lấy được văn bản gốc từ giá trị băm

Băm sử dụng thuật toán toán học để chuyển đổi văn bản thuần túy thành các giá trị được băm. Không có khóa nào giải mã giá trị băm như trong mã hóa. Hàm băm mật mã chủ yếu được sử dụng để xác thực. Ví dụ, trong đăng ký/đăng nhập. Khi người dùng đăng ký, mật khẩu của họ được băm trước khi lưu trữ chúng trong cơ sở dữ liệu. Bất cứ khi nào người dùng cố gắng đăng nhập, mật khẩu của họ sẽ được băm và so sánh với các giá trị được băm trong cơ sở dữ liệu để đảm bảo nó khớp. Với phương pháp này, nếu kẻ tấn công chiếm quyền điều khiển cơ sở dữ liệu của một công ty phần mềm, thông tin đăng nhập của người dùng sẽ vô dụng đối với họ vì họ không thể giải mã hoặc hiểu mật khẩu

API mật mã web của JavaScript cung cấp hàm crypto.subtle.digest cho phép bạn thực hiện hàm băm mật mã. Với crypto.subtle.digest function, bạn có thể băm bản rõ bằng thuật toán encrypt0, encrypt1 hoặc, encrypt2, sử dụng cú pháp sau

Để hiểu cách băm tin nhắn với hàm crypto.subtle.digest, hãy xem ví dụ bên dưới

Từ chương trình ví dụ trên, chúng tôi đã băm văn bản Đây là một tin nhắn an toàn từ Mary bằng thuật toán encrypt4 và chuyển đổi các byte thành chuỗi hex. Thuật toán encrypt0 hiện dễ bị tấn công;

Tạo và xác minh chữ ký

Đây là một chức năng mã hóa khác mà bạn có thể thực hiện với API mã hóa web của JavaScript. Với chức năng encrypt6 và encrypt7, bạn có thể ký tài liệu bằng phím. Người nhận sử dụng khóa của họ để xác thực tính xác thực của tin nhắn

Hãy xem xét một tình huống khi bạn muốn gửi tài liệu cho bạn của mình. Để tài liệu được xác thực, bạn cần phải ký tên. Bạn của bạn nhận được tin nhắn nhận ra rằng đó là từ bạn khi họ nhìn thấy chữ ký

Để ký và xác minh tài liệu bằng hàm encrypt6 và encrypt9, hãy sử dụng cú pháp sau

thuật toán mật mã

Máy tính không có suy nghĩ của riêng mình. Do đó, bất cứ khi nào chúng tôi muốn máy tính thực hiện một số tác vụ, chúng tôi sẽ cho chúng biết cách thực hiện. Ví dụ: nếu bạn muốn máy tính của mình thực hiện các phép tính cơ bản, bạn sẽ phải cho máy tính biết cần cộng những số nào và cách thực hiện

Các thuật toán là một tập hợp các hướng dẫn có thể thực hiện trên máy tính được xác định rõ ràng để giải quyết các vấn đề. Trong mật mã, bạn cần chỉ định cách bạn muốn máy tính của mình thực hiện chức năng mật mã. Có nhiều loại thuật toán SHA khác nhau, mỗi loại chỉ định độ dài bit của giá trị băm. Trong phần này, chúng ta sẽ xem xét các chức năng mã hóa cơ bản mà API mã hóa web của JavaScript hỗ trợ

ECDH (Đường cong elip Diffie-Hellman)

Thuật toán mật mã này được sử dụng để tạo khóa và thỏa thuận khóa. Elliptic Curve Giao thức thỏa thuận khóa Diffie-Hellman cho phép hai bên có cặp khóa riêng-công khai thực hiện giao tiếp an toàn. Nó được sử dụng cho mật mã Elliptic Curve Diffie-Hellman

Thuật toán Elliptic Curve Diffie-Hellman cho phép bạn thực hiện các thao tác sau

  • tạo khóa
  • Dẫn xuất bit
  • Nhập khóa
  • Xuất khóa

SHA (Thuật toán băm an toàn)

Thuật toán này chủ yếu được sử dụng để thực hiện các hàm băm. Nó cô đặc dữ liệu biến đổi thành đầu ra chuỗi bit có kích thước cố định. API mã hóa web của JavaScript cho phép bạn thực hiện các hàm băm với encrypt0 và encrypt1, hỗ trợ cho “SHA-256”, “SHA-384”, “SHA-512” để sử dụng thuật toán này, bạn sẽ phải sử dụng tiền điện tử. tế nhị. chức năng tiêu hóa

HMAC (Mã xác thực tin nhắn dựa trên hàm băm)

Sau khi băm một giá trị bằng hàm băm, bạn sẽ cần xác minh rằng thư đến bằng với giá trị băm. Hãy nhớ rằng chúng ta hầu như không thể chuyển đổi giá trị băm trở lại văn bản gốc của nó. Để so sánh các giá trị, thuật toán encrypt2 được sử dụng để ký và xác minh tài liệu để xác định tính xác thực của nó. Với thuật toán này, bạn có thể thực hiện các chức năng sau

  • Dấu hiệu
  • Xác minh
  • Tạo khóa
  • Khóa nhập
  • Xuất khóa
  • Nhận độ dài khóa

HKDF (Hàm dẫn xuất khóa dựa trên hàm băm)

Hàm dẫn xuất khóa dựa trên hàm băm là hàm dẫn xuất khóa mật mã dựa trên HMAC. Nó sử dụng phương pháp khai thác-sau đó-mở rộng. Bạn có thể sử dụng thuật toán này để chuyển đổi các bí mật được chia sẻ thành các khóa phù hợp để mã hóa, kiểm tra tính toàn vẹn hoặc xác thực. Các thao tác bạn có thể thực hiện với thuật toán này như sau

  • Dẫn xuất bit
  • Nhập khóa
  • Nhận độ dài khóa

PBKDF2 (Chức năng dẫn xuất khóa dựa trên mật khẩu 2)

Thuật toán PBKDF2 được sử dụng để lấy các khóa mật mã, sử dụng hàm dẫn xuất khóa dựa trên mật khẩu PKCS#5 (Tiêu chuẩn mã hóa khóa công khai #5) phiên bản 2. Cũng giống như hàm HKDF, bạn có thể thực hiện Dẫn xuất bit, Nhập khóa và Lấy độ dài khóa bằng thuật toán này

ECDSA (Thuật toán chữ ký số đường cong Elliptic)

Thuật toán chữ ký số Elliptic Curve cho phép các nhà phát triển ký và xác minh tài liệu, sử dụng mật mã đường cong elliptic. Nó cung cấp một biến thể của Thuật toán chữ ký số (DSA). Bạn có thể thực hiện các thao tác sau với thuật toán ECDSA

  • Dấu hiệu
  • Xác minh
  • Tạo khóa
  • Khóa nhập
  • Xuất khóa

Thuật toán RSA (Rivest–Shamir–Adleman)

Thuật toán RSA được sử dụng để bảo mật thông tin qua internet. Nó là một thuật toán mật mã bất đối xứng. Hai khóa được sử dụng cho quá trình mã hóa và giải mã. Một khóa là công khai và có thể được chia sẻ giữa những người dùng được ủy quyền, trong khi khóa thứ hai là riêng tư phải được giữ kín

Rivest–Shamir–Adleman hỗ trợ các thuật toán khác với sơ đồ đệm có thể được sử dụng với thuật toán RSA. API mã hóa web của JavaScript hỗ trợ các thuật toán RSA và sơ đồ đệm sau

  • RSASSA-PKCS1-v1_5
  • RSA-PSS
  • RSA-OAEP

Thuật toán AES (Chuẩn mã hóa nâng cao)

Thuật toán tiêu chuẩn mã hóa nâng cao hầu hết được biết đến với tên ban đầu là Rijndael. Nó được sử dụng để mã hóa dữ liệu điện tử và được thành lập bởi U. S. Viện Tiêu chuẩn và Công nghệ Quốc gia (NIST) năm 2001. API mã hóa web của JavaScript hỗ trợ các mô hình mã hóa khác nhau sử dụng khối AES, chúng là

  • AES-CTR
  • AES-CBC
  • AES-GCM
  • AES-KW
Các trường hợp sử dụng API mã hóa web của JavaScript

Có rất nhiều ứng dụng API mã hóa web của JavaScript trong mã hóa thời gian thực. Trong phần này, chúng ta sẽ xem xét các ứng dụng khác nhau của mật mã trong thời gian thực

Xác thực đa yếu tố

Đôi khi, tin tặc có thể đánh cắp mật khẩu của người dùng. Vì vậy, ngay cả khi những mật khẩu này được băm hoặc mã hóa trong cơ sở dữ liệu, nó cũng không thể ngăn chúng truy cập vào tài khoản của người dùng. Để đảm bảo rằng ai đó đang truy cập tài khoản là chủ sở hữu thực sự, các ứng dụng cho phép xác thực đa yếu tố

Thay vì sử dụng xác thực tầng vận chuyển, chẳng hạn như ứng dụng chứng chỉ máy khách TLS có thể sử dụng các khóa máy khách phù hợp có thể đã được tạo trước đó thông qua tác nhân người dùng như mã thông báo đa yếu tố

Trao đổi tài liệu được bảo vệ

Một trong những mục tiêu của mật mã là bảo mật thông tin liên lạc qua internet với sự có mặt của bên thứ ba. Vì có các bên thứ ba liên tục theo dõi cuộc hội thoại của người khác, nên API mã hóa web của JavaScript cho phép bạn ký, xác minh và mã hóa tài liệu. Bảo vệ tài liệu yêu cầu người dùng được ủy quyền phải có khóa cho phép họ truy cập vào tài liệu

Lưu trữ đám mây

Bạn có thể bảo vệ tài liệu trước khi tải chúng lên máy chủ từ xa bằng cách sử dụng API mã hóa web của JavaScript. Ứng dụng có thể yêu cầu người dùng chọn khóa riêng hoặc khóa bí mật, lấy khóa mã hóa, mã hóa tài liệu, sau đó tải dữ liệu được mã hóa lên nhà cung cấp dịch vụ bằng các API hiện có

Nhắn tin an toàn

Người dùng có thể giao tiếp an toàn qua internet với các chương trình như nhắn tin không ghi âm (OTR). Hai bên tham gia giao tiếp có thể mã hóa và giải mã tin nhắn bằng các khóa mã xác thực tin nhắn (MAC) để ngăn chặn giả mạo

Ký và mã hóa đối tượng JavaScript (JOSE)

Bạn có thể tương tác với các cấu trúc và định dạng thông báo được xác định bởi Nhóm làm việc mã hóa và ký mã đối tượng JavaScript (JOSE) với API mã hóa web của JavaScript

Cách đối phó với các cuộc tấn công MitM

Man in the middle attack (MitM) còn có thể gọi là machine in the middle attack hay person in the middle attack. Đó là một cuộc tấn công mạng trong đó kẻ tấn công nghe trộm thông tin liên lạc giữa hai bên, để chiếm quyền điều khiển hoặc sửa đổi thông tin liên lạc

Ví dụ: một người trung gian có thể chặn thông tin được gửi từ một bên trước khi nó đến bên kia. Hãy xem trường hợp hai người;

Nếu một người đàn ông ở giữa (James) nắm được chìa khóa của Nancy, anh ta có thể giải mã tin nhắn, xem hoặc sửa đổi nội dung của nó trước khi gửi cho Joy

Hãy xem xét các cách khác nhau mà mọi người đối phó với các cuộc tấn công MitM

  1. Việc sử dụng phát hiện giả mạo là một phương pháp tuyệt vời để chỉ ra rằng một cuộc tấn công MitM đã xảy ra. Chẳng hạn, các bên có thể kiểm tra sự khác biệt về thời gian phản hồi
  2. Việc sử dụng xác thực lẫn nhau là một phương pháp có thể giảm thiểu các cuộc tấn công MitM. Bởi vì máy chủ và máy khách xác thực giao tiếp của nhau
  3. Phân tích pháp y là một phương pháp khác để xử lý các cuộc tấn công MitM, vì nó xác định liệu có một cuộc tấn công hay không và xác định nguồn gốc của cuộc tấn công
Bảo mật, một vấn đề lớn

Mọi người cần cảm thấy an toàn bất cứ khi nào họ giao tiếp qua internet. Bảo quản không an toàn không chỉ có nghĩa là thông tin liên lạc của bạn có thể bị rò rỉ trên internet, một số kẻ tấn công còn đi xa hơn là đánh cắp người dùng, bắt nạt người dùng và thậm chí truy tìm họ để gây tổn hại về thể chất

Nhà phát triển phải xây dựng sản phẩm bền vững và an toàn cho người dùng. Điều gì xảy ra khi các công ty bỏ bê quyền riêng tư và an toàn của người dùng khi xây dựng sản phẩm?

Các cơ quan quản lý bảo vệ dữ liệu quy định cách dữ liệu cá nhân được xử lý qua internet. Ví dụ: GDPR, một cơ quan quản lý dữ liệu, sẽ phạt tới 20 triệu euro (khoảng 18 triệu bảng Anh) hoặc 4% doanh thu toàn cầu hàng năm — tùy theo mức nào lớn hơn — đối với hành vi vi phạm. Do đó, các công ty phải thực hiện mọi bước cần thiết để đảm bảo rằng dữ liệu của người dùng luôn được bảo mật

Điều này có nghĩa là các công ty cũng phải rất cẩn thận về các công cụ và nhà cung cấp của bên thứ ba mà họ chọn hợp tác. Điều rất quan trọng là các công cụ đang được tất cả các tổ chức áp dụng phải an toàn và tôn trọng quyền riêng tư. Điều này đặc biệt quan trọng đối với các sản phẩm nặng về nhập dữ liệu như phân tích, giám sát, theo dõi lỗi, v.v.

Khi xây dựng SessionStack, quyền riêng tư và bảo mật của người dùng là ưu tiên hàng đầu vì sản phẩm thu thập nhiều loại dữ liệu từ trình duyệt trong các phiên của người dùng. Sau khi SessionStack được tích hợp vào ứng dụng web, nó sẽ bắt đầu thu thập dữ liệu như thay đổi DOM, tương tác người dùng, ngoại lệ JavaScript, dấu vết ngăn xếp, yêu cầu mạng và thông báo gỡ lỗi. Dữ liệu này sau đó được xử lý và cho phép các nhóm phát lại hành trình của người dùng dưới dạng video để tối ưu hóa quy trình làm việc của sản phẩm, tái tạo lỗi hoặc xem người dùng gặp khó khăn ở đâu

Chúng tôi đã tích hợp các tính năng vào SessionStack cho phép khách hàng của chúng tôi có toàn quyền kiểm soát dữ liệu nào đang được gửi từ trình duyệt đến máy chủ của chúng tôi. Thậm chí còn có tùy chọn che giấu bất kỳ dữ liệu nào trên trang, chẳng hạn như PII, dữ liệu này sẽ bị bỏ qua và sẽ không rời khỏi trình duyệt

Mã hóa JavaScript có an toàn không?

Với API mật mã web của JavaScript, máy chủ không thể xem dữ liệu vì nó được bảo mật bằng mật mã . Chỉ người gửi và người nhận có quyền truy cập vào dữ liệu liên lạc. Từ sơ đồ trên, bạn có thể thấy dữ liệu từ người gửi được mã hóa bằng API.

Làm cách nào để mã hóa dữ liệu trong JavaScript?

Mã hóa đối tượng .
dữ liệu var = [{ foo. thanh}, { thanh. foo}];
var ciphertext = CryptoJS. AES. mã hóa (JSON. stringify(dữ liệu), 'khóa bí mật 123');
var byte = CryptoJS. AES. giải mã (bản mã. toString(), 'khóa bí mật 123');
var decryptedData = JSON. phân tích cú pháp (byte. toString(CryptoJS. enc. UTF8));

Làm cách nào để JavaScript không thể đọc được?

Không thể đọc được, có thể khó đọc hơn. Cuối cùng, trình duyệt của bạn sẽ phải đọc mã JS, đó là lý do tại sao "không đọc được" là không thể. khó đọc. Như đã chỉ ra trong giải pháp 1, thu nhỏ và che giấu là 2 kỹ thuật làm cho mã nguồn khó đọc hơn .

Làm cách nào để giải mã mã nguồn JavaScript?

Nếu bạn có Google Chrome, hãy mở trang web có JavaScript mà bạn đang cố giải mã. Nhấn F12 để mở Công cụ dành cho nhà phát triển bên trong Chrome. Bây giờ hãy chuyển sang tab Tập lệnh, nhấp chuột phải và chọn Gỡ rối mã nguồn . Đó là nó.