Mã hóa trong môi trường JavaScript là trọng tâm chính của việc giữ an toàn cho thông tin cá nhân thông qua các thuật toán nhị phân. Thông qua quá trình xáo trộn các chuỗi và số nguyên, các thuật toán này tuân theo một kết quả phù hợp nhất để bảo vệ chống lại tin tặc
Tuy nhiên, các nhà phát triển có xu hướng không tự mã hóa thông tin cá nhân trong các ứng dụng web của họ do sự tẻ nhạt và không an toàn đi kèm với nó. Thay vào đó, hầu hết có xu hướng chuyển sang một thư viện làm việc cho họ theo cách có kinh nghiệm hơn, nhưng vấn đề với các thư viện này là chúng tiếp tục làm phức tạp hóa thực tiễn. Đây là lúc quá trình đơn giản hóa tiến thêm một bước và Crypto-JS ra đời
Crypto-JS là một thư viện mật mã nhằm thực thi các thuật toán theo phương pháp thực hành tốt nhất có nghĩa là được cô đọng trong việc sử dụng đơn giản hóa các lệnh gọi lớp/phương thức
Hôm nay tôi sẽ trình bày một bản demo giới thiệu các tính năng mà Crypto-JS có thể mang lại để bảo mật ứng dụng web tiếp theo của bạn. Bắt đầu nào
Mã hóa một chuỗiĐiều chúng ta sẽ đề cập trước tiên là cách sử dụng các chức năng cơ bản từ Crypto-JS để tạo một mảng ký tự được mã hóa. Chúng ta có thể hoàn thành nhiệm vụ này bằng cách trình bày cách mã hóa một chuỗi cơ bản.
Hàm băm cơ bản, chẳng hạn như các biến thể được liệt kê ở trên, thông thường sẽ yêu cầu phương thức toString được đính kèm ở phía sau để xem hàm băm chuỗi được tạo. Thông thường các chuỗi này sẽ trông giống như thế này
Raw: {[Array]}
Stringified: 78e731027d8fd50ed642340b7c9a63b3
Hàm băm này vẫn có thể được mã hóa hơn nữa. Bằng cách áp dụng một phương pháp bổ sung được gọi là enc, chúng tôi có thể mã hóa hàm băm thành bất kỳ định dạng nào chúng tôi mong muốn. Vì lợi ích của bài thuyết trình này, tôi sẽ chứng minh sử dụng Base64
Tạo mật mãTrước khi chúng tôi đi thẳng vào giải mã, có một chi tiết quan trọng cần được thảo luận. Băm KHÔNG THỂ được giải mã sau khi được tạo. Để giải mã một hàm băm, trước tiên chúng phải được xác định bằng một bí mật bằng cách sử dụng mật mã. Mật mã được sử dụng tốt nhất khi xử lý các hàm băm được mã hóa cần được so sánh với hàm băm khác
Bây giờ nếu muốn, chúng tôi có thể thêm các tùy chọn bổ sung như muối để mã hóa thêm bản mã của mình để tăng cường bảo mật hoặc xử lý hàm băm lũy tiến, kết hợp kết quả của 2 hàm băm trở lên để tạo bản mã. Nhưng vì lợi ích của blog này, chúng tôi giữ cho nó đơn giản
Giải mã mật mã được mã hóaBây giờ chúng ta đã tìm hiểu cách tạo hàm băm cơ bản và mã hóa hàm băm đó bằng cách sử dụng mật mã, hãy nói về điều ngược lại; . Giải mã, như đã nêu trước đó, chỉ có thể được áp dụng cho mật mã vì mật mã được duy trì và có thể được gọi với chuỗi bí mật xác định chúng. Hãy giải mã bản mã mà chúng ta đã tạo trước đó
Và bùm. Mật mã được tạo trước đó được truy xuất dựa trên bí mật được gán được giải mã trở lại dạng chuỗi ban đầu. Bây giờ nếu muốn, chúng tôi có thể giải mã bản mã của mình thành bất kỳ định dạng nào, chẳng hạn như base64, ASCII hoặc thậm chí là nhị phân để đặt tên cho một số
Thông qua quá trình đọc bài viết này, chúng tôi đã đề cập chính xác những gì Crypto-JS làm với tư cách là một thư viện và đề cập đến cách tạo hàm băm ở bốn dạng khác nhau. Ngoài ra, chúng tôi đã trình bày cách mã hóa chuỗi bằng mật mã và giải mã bản mã trở lại thành chuỗi. Hy vọng rằng bài viết này đã làm sáng tỏ thế giới mã hóa và bạn đã rời khỏi bài viết này để học hỏi nhiều hơn là tham gia
Javascript hỗ trợ mọi ứng dụng web hiện đại. Các ứng dụng web bảo mật có thể thực hiện mã hóa và giải mã như thế nào?
Andrew MilichNgày 10 tháng 12 năm 2022
Mã hóa được sử dụng bởi hầu hết mọi ứng dụng trên internet ngày nay. Từ mã hóa dữ liệu bên trong cơ sở dữ liệu, đến mã hóa mạng được sử dụng trong SSL/TLS [mọi https. trang web], đến mã hóa đầu cuối bên trong các sản phẩm liên lạc và nhắn tin an toàn, sự đa dạng của các thuật toán, quy trình mã hóa và mật mã hiện cung cấp năng lượng cho ngăn xếp web hiện đại
Tổng quan và từ vựng
Dưới đây, chúng tôi sẽ xác định một vài chủ đề được sử dụng xuyên suốt blog
mã hóa đối xứng. Một loại mã hóa trong đó cùng một khóa được sử dụng để mã hóa và giải mã một tin nhắn
mã hóa bất đối xứng. Một loại mã hóa trong đó hai khóa khác nhau được sử dụng để mã hóa và giải mã một tin nhắn
băm. Hàm mật mã [“hàm băm”] tạo ra đầu ra có kích thước cố định [được gọi là hàm băm] từ đầu vào có kích thước bất kỳ. Băm thường được sử dụng để xác minh tính toàn vẹn của dữ liệu
mã hóa. Một quá trình chuyển đổi dữ liệu sang một định dạng khác bằng một thuật toán cụ thể. Mã hóa thường được sử dụng để chuyển đổi dữ liệu sang định dạng hiệu quả hơn cho việc lưu trữ hoặc truyền tải. Nó không phải là một dạng mã hóa và không cung cấp bất kỳ lợi ích bảo mật nào
Mã hóa và giải mã trong Javascript
Mã hóa và giải mã là những khái niệm quan trọng trong lĩnh vực khoa học máy tính và bảo mật thông tin. Mã hóa là quá trình chuyển đổi văn bản thuần túy [i. e. văn bản thông thường, có thể đọc được] thành bản mã [i. e. văn bản bị xáo trộn, không thể đọc được] bằng thuật toán toán học và khóa bí mật. Giải mã là quá trình đảo ngược chuyển đổi bản mã trở lại thành văn bản thuần túy sử dụng cùng một thuật toán và khóa
Trong Javascript, mã hóa và giải mã thường được triển khai bằng một trong số các thuật toán phổ biến, chẳng hạn như Tiêu chuẩn mã hóa nâng cao [AES] hoặc thuật toán RSA. Thuật toán cụ thể được sử dụng tùy thuộc vào nhu cầu của ứng dụng và yêu cầu bảo mật của dữ liệu được mã hóa
Để minh họa cách mã hóa và giải mã hoạt động trong Javascript, hãy xem xét một ví dụ đơn giản sử dụng thuật toán AES. Trong ví dụ này, chúng tôi sẽ sử dụng khóa bí mật là "12345" và một tin nhắn văn bản đơn giản là "Xin chào, thế giới. "
Trước tiên, chúng ta cần nhập các thư viện cần thiết để mã hóa AES. Trong trường hợp này, chúng tôi sẽ sử dụng thư viện "crypto-js", thư viện này có thể được cài đặt vào các phần phụ thuộc của dự án bằng lệnh NPM sau
npm cài đặt crypto-js
Lưu ý rằng nếu bạn thích sử dụng sợi, lệnh “yar add crypto-js” cũng sẽ hoạt động. Sau khi thư viện được cài đặt, chúng tôi có thể nhập nó vào mã Javascript của mình bằng dòng mã sau
const CryptoJS = require["crypto-js"];
Tiếp theo, chúng ta cần xác định khóa bí mật và tin nhắn văn bản thuần túy. Trong ví dụ này, chúng tôi sẽ sử dụng khóa và thông báo được xác định trước đó
khóa const = "12345";
const plainText = "Chào thế giới. “;
Với khóa và văn bản thuần túy được xác định, giờ đây chúng ta có thể mã hóa tin nhắn bằng thuật toán AES và chức năng mã hóa CryptoJS. Trong Javascript, điều này được thực hiện bằng đoạn mã sau
const được mã hóa = CryptoJS. AES. mã hóa [văn bản gốc, khóa];
Tin nhắn được mã hóa được trả về dưới dạng một chuỗi bản mã, không thể đọc được đối với bất kỳ ai không có khóa bí mật. Ví dụ: văn bản được mã hóa trong trường hợp này có thể trông giống như thế này
U2FsdGVkX18cwq3S7v2bT+E9T9XkTfH4D4Gp+gWZFok=
Để giải mã bản mã trở lại tin nhắn văn bản thuần túy ban đầu, chúng ta có thể sử dụng chức năng giải mã sau
const đã giải mã = CryptoJS. AES. giải mã [được mã hóa, khóa];
Dòng này sử dụng bản mã được mã hóa và khóa bí mật để giải mã tin nhắn trở lại thành văn bản gốc ban đầu [“Xin chào, thế giới. ”]. Trong một số trường hợp, các chức năng mã hóa hoặc giải mã yêu cầu một số mã hóa văn bản nhất định, chẳng hạn như hex hoặc utf8, mỗi mã hóa sử dụng các bộ ký tự khác nhau để biểu thị dữ liệu
Mã hóa AES, được sử dụng ở đây, là một thuật toán mã hóa đối xứng trong đó cùng một khóa bí mật được sử dụng để mã hóa và giải mã văn bản
Trong mã hóa bất đối xứng, các khóa khác nhau được sử dụng để mã hóa văn bản thuần túy [khóa chung] và giải mã văn bản mật mã [khóa riêng]
Thư viện tiền điện tử NodeJS
Nút. js là môi trường thời gian chạy để thực thi mã JavaScript ở phía máy chủ. Nút. js bao gồm một thư viện tích hợp có tên là crypto cung cấp một số chức năng mã hóa, bao gồm các chức năng tạo hàm băm, ký và xác minh chữ ký số cũng như tạo số ngẫu nhiên
Web Cryptography API, hay WebCrypto, là một API JavaScript cung cấp chức năng mã hóa tương tự như thư viện tiền điện tử trong Node. js. WebCrypto được thiết kế để sử dụng trong các ứng dụng web và cho phép các nhà phát triển thực hiện các thao tác mã hóa trực tiếp trong trình duyệt. Điều này có thể hữu ích để triển khai các tính năng bảo mật như băm mật khẩu và mã hóa dữ liệu nhạy cảm mà không phải gửi dữ liệu đến máy chủ để xử lý
Cả thư viện crypto trong Node. js và API WebCrypto cung cấp một bộ công cụ mạnh mẽ để triển khai các chức năng mã hóa trong ứng dụng web. Tuy nhiên, điều quan trọng là phải sử dụng các công cụ này một cách cẩn thận và an toàn để đảm bảo rằng thông tin nhạy cảm được bảo vệ
Tại sao sử dụng mã hóa?
Mã hóa được sử dụng trong các ứng dụng web để bảo vệ thông tin nhạy cảm như mật khẩu, số thẻ tín dụng và thông tin cá nhân khác khỏi bị chặn và đọc bởi những cá nhân trái phép. Khi người dùng gửi thông tin nhạy cảm đến ứng dụng web, thông tin sẽ được ứng dụng web mã hóa trước khi truyền qua internet. Điều này đảm bảo rằng ngay cả khi thông tin bị chặn bởi bên thứ ba, nó sẽ không thể đọc được và không thể sử dụng được. Mã hóa thông tin nhạy cảm là một biện pháp bảo mật quan trọng giúp giữ an toàn và bảo mật thông tin người dùng
Ví dụ về các ứng dụng sử dụng mã hóa trên web
MetaMask [ví Ethereum]
MetaMask là một tiện ích mở rộng của trình duyệt cho phép người dùng tương tác với chuỗi khối Ethereum từ trình duyệt web của họ. MetaMask sử dụng mã hóa để bảo vệ thông tin nhạy cảm được lưu trữ trong ví của người dùng
Khi người dùng tạo ví bằng MetaMask, họ được yêu cầu chọn mật khẩu. Mật khẩu này được sử dụng để mã hóa các khóa riêng tư của người dùng, được lưu trữ cục bộ trên thiết bị của người dùng. Điều này có nghĩa là khóa riêng của người dùng không thể đọc được nếu không có mật khẩu và do đó được bảo vệ khỏi truy cập trái phép
1Password [Trình quản lý mật khẩu]
1Password là trình quản lý mật khẩu giúp người dùng lưu trữ và quản lý mật khẩu trực tuyến của họ một cách an toàn. 1Password sử dụng mã hóa để bảo vệ thông tin nhạy cảm được lưu trữ trong kho mật khẩu của nó. Khi người dùng tạo tài khoản bằng 1Password, họ được yêu cầu chọn mật khẩu chính. Mật khẩu chính này được sử dụng để mã hóa kho mật khẩu của người dùng, điều đó có nghĩa là thông tin được lưu trữ trong kho sẽ không thể đọc được nếu không có mật khẩu chính
1Password sử dụng kết hợp mã hóa đối xứng và bất đối xứng để bảo vệ thông tin người dùng. Khi người dùng tạo tài khoản lần đầu tiên và đặt mật khẩu chính, 1Password sẽ tạo một khóa mã hóa duy nhất được sử dụng để mã hóa kho mật khẩu của người dùng. Khóa mã hóa này sau đó được mã hóa bằng mật khẩu chính của người dùng và được lưu trữ trên máy chủ của 1Password
Khi người dùng đăng nhập vào 1Password và nhập mật khẩu chính của họ, 1Password sẽ sử dụng khóa mã hóa được mã hóa để giải mã kho mật khẩu của người dùng. Mật khẩu chính của người dùng không bao giờ được gửi đến máy chủ của 1Password và chỉ được sử dụng cục bộ trên thiết bị của người dùng để giải mã khóa mã hóa được mã hóa. Điều này có nghĩa là 1Password có thể bảo vệ thông tin người dùng mà không cần truy cập vào mật khẩu chính của người dùng
Skiff Mail, Lịch, Trang và Drive [bộ email và năng suất]
Skiff là bộ cộng tác và email được mã hóa đầu cuối, ưu tiên quyền riêng tư với thư, lịch, ghi chú cộng tác và các sản phẩm lưu trữ tệp. Tất cả dữ liệu trên Skiff - tin nhắn, tệp, ghi chú và sự kiện lịch - đều được mã hóa nối đầu, nghĩa là chỉ bạn mới có quyền truy cập vào dữ liệu của mình. Khi đăng nhập vào Skiff, thiết bị của bạn sẽ giải mã dữ liệu thành dạng người có thể đọc được
Skiff được sử dụng miễn phí, với các gói trả phí cũng có sẵn. Tương tự như MetaMask và 1Password, mật khẩu được sử dụng để mã hóa thông tin cá nhân khi bạn đăng nhập. Mật khẩu này cũng cho phép bạn truyền và giải mã dữ liệu trên một thiết bị khác, đồng thời giữ cho dữ liệu đó được mã hóa nối đầu
Skiff là một trong những ví dụ tốt nhất về ứng dụng trực quan, thân thiện với người dùng, sử dụng mật mã bên trong trình duyệt và trong Javascript
Tham khảo thêm
Chúng tôi hy vọng blog này hữu ích. Để biết thêm thông tin, hãy xem các sản phẩm của Skiff hoặc trang GitHub. Chúng tôi cũng sẽ chia sẻ các hướng dẫn khác về cách thực hiện mã hóa bất đối xứng trong javascript