Mã hóa và giải mã trong PHP

mcrypt là một trong những tiện ích mở rộng PHP lâu đời nhất mang lại khả năng mã hóa/giải mã cho PHP. Nó không còn được duy trì và PHP đã hủy gói nó trong PHP 7. 2

OpenSSL là một thư viện khác được áp dụng rộng rãi hơn và được hỗ trợ tích cực. OpenSSL cung cấp nhiều loại thuật toán mật mã, trao đổi khóa và xác thực và hầu hết chúng có thể không an toàn nếu sử dụng sai trường hợp sử dụng. Ví dụ: thuật toán mã hóa phổ biến nhất mà OpenSSL cung cấp là AES (Tiêu chuẩn mã hóa nâng cao) có một số chế độ hoạt động và kích thước khóa để lại chỗ cho việc sử dụng nó không an toàn. Ngay từ đầu, các chế độ AES chẳng hạn như ECB (Sách mã điện tử) và một số chế độ như CBC (Chuỗi khối mật mã) yêu cầu xác thực các thông báo được mã hóa để hoàn toàn an toàn và vẫn có thể dễ bị tấn công bằng tiên tri đệm, chẳng hạn như POODLE

Libsodium, một nhánh của NaCl là một thư viện mật mã hiện đại hơn và được đánh giá cao hơn. Nó cung cấp các giá trị mặc định an toàn và hợp lý, đồng thời lấy đi rất nhiều quyền quyết định từ người dùng cuối cho đến những người bảo trì thư viện. PHP. Libsodium có sẵn dưới dạng phần mở rộng PECL, nhưng PHP cũng bao gồm phần mở rộng trong lõi PHP kể từ PHP 7. 2



Kể từ PHP 7. 2, Phần mở rộng natri được bao gồm trong lõi PHP. Có khả năng tiện ích mở rộng Natri đã có sẵn và được kích hoạt, điều này có thể được xác nhận từ

$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
0

Mã hóa và giải mã trong PHP

Ngoài ra, có thể liệt kê các phần mở rộng PHP trong PHP CLI và kiểm tra đầu ra

php -m | grep sodium

Mã hóa và giải mã trong PHP


Nếu phần mở rộng Natri không có sẵn, hãy kích hoạt nó bằng cách thêm chỉ thị

$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
1. PHP7. 2 trở lên không yêu cầu phần mở rộng tệp (e. g.
$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
2 hoặc
$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
3 ) trong chỉ thị của
$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
1

Ví dụ sau sẽ hoạt động với hầu hết các thiết lập PHP tiêu chuẩn

extension=sodium

Khi biên dịch PHP từ nguồn, việc bật tiện ích mở rộng Natri yêu cầu cờ

$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
5 và thư viện
$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
6, dễ dàng cài đặt và

Với mã hóa và giải mã đối xứng, cùng một khóa được sử dụng để mã hóa và giải mã. Trong thực tế, điều này tương tự như việc sử dụng khóa cửa khóa và mở khóa cửa bằng chìa khóa


Nếu một tin nhắn được mã hóa và giải mã trên cùng một thiết bị, mã hóa đối xứng sẽ phù hợp hơn. Một số trường hợp sử dụng ví dụ về sử dụng mã hóa đối xứng

  • Mã hóa cookie của trình duyệt trước khi gửi cho người dùng và giải mã cookie đến
  • Mã hóa ổ lưu trữ và giải mã bằng cùng một khóa
  • Mã hóa tệp Zip/Rar

Mã hóa bất đối xứng liên quan đến một cặp khóa. Khóa công khai và khóa riêng của nó

Sự bất đối xứng ở đây là các tin nhắn được mã hóa bằng khóa chung và nó chỉ có thể được giải mã bằng khóa riêng. Như tên cho thấy, công chúng có thể được phân phối tự do và công khai. Khi cặp khóa được tạo, nó được tạo theo cách mà về mặt toán học, khóa riêng — và riêng khóa riêng — có thể giải mã một tin nhắn được mã hóa bằng khóa chung

Sự bất đối xứng này cho phép chia sẻ khóa công khai với bất kỳ bên quan tâm nào và yêu cầu họ gửi tin nhắn được mã hóa mà không ai khác có thể đọc được nếu không có khóa riêng


Một số trường hợp sử dụng cho các trường hợp sử dụng không đối xứng bao gồm

  • Mã hóa nhật ký máy chủ và gửi chúng đến máy chủ từ xa để chỉ máy chủ từ xa mới có thể đọc chúng
  • Bắt tay SSL/TLS
  • Gửi mã hóa bằng khóa công khai của người nhận

Tiện ích mở rộng PHP Natri cung cấp một vài thuật toán với các giá trị mặc định tối ưu và kích thước khóa cố định để mã hóa/giải mã dữ liệu bằng khóa

Tất cả các thuật toán được cung cấp bởi tiện ích mở rộng Natri đều cung cấp mã hóa được xác thực, có nghĩa là văn bản được mã hóa sẽ được xác thực để chống giả mạo. Điều này ngăn chặn các cuộc tấn công Chosen-ciphertext. Với các cách tiếp cận như mcrypt hoặc hầu hết các mật mã từ OpenSSL, người gọi có thể tạo HMAC/chữ ký và bảo vệ chống lại các cuộc tấn công như vậy tùy thuộc vào người gọi

Các ứng dụng cần lưu trữ thẻ xác thực (MAC) và văn bản được mã hóa có thể làm như vậy bằng cách sử dụng các biến thể API "tách rời" được cung cấp Natri

Hiện tại, Natri cung cấp bốn mật mã để lựa chọn

Mật mãKích thước khóaKích thước nonceKích thước MACGhi chúAES256-GCM256 bit96 bit128 bitĐược hỗ trợ rộng rãi trong nhiều thư viện, Yêu cầu hỗ trợ phần cứngChaCha20-Poly1305256 bit64 bit128 bitĐược hỗ trợ rộng rãi trong nhiều thư viện và Libsodium >= 0. 6. 0ChaCha20-Poly1305 - IETF256 bits96 bits128 bitsĐược hỗ trợ rộng rãi trong nhiều thư viện và Libsodium >= 1. 0. 4XChaCha20-Poly1305 - IETF256 bit192 bit128 bitĐược hỗ trợ rộng rãi trong nhiều thư viện và Libsodium >= 1. 0. 12XSalsa20-Poly1305256 bit192 bit128 bitLựa chọn mặc định cho
$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
9 API

Tất cả bốn mật mã đều cung cấp xác thực theo mặc định, an toàn khi sử dụng. Chọn mật mã phù hợp là sự cân bằng giữa khả năng tương thích với các thư viện khác và ngôn ngữ lập trình và công cụ

AES256-GCM được hỗ trợ rộng rãi trong hầu hết các CPU (bộ hướng dẫn AES-NI) và được hỗ trợ trong các tiện ích mở rộng khác như OpenSSL

Nếu khả năng tương thích giữa các ngôn ngữ lập trình và công cụ khác không phải là vấn đề đáng lo ngại, thì đó là lựa chọn an toàn nhất và là trọng tâm của phần còn lại của phần này

Tiện ích mở rộng natri cung cấp các chức năng để dễ dàng tạo khóa, mã hóa và giải mã tin nhắn. Ngoài ra, hàm

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
1 có ích để tạo một giá trị nonce ngẫu nhiên

  • $nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
    2. Tạo khóa bí mật có độ dài yêu cầu
  • $nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
    1. Tạo byte ngẫu nhiên
  • $nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
    4. Mã hóa một tin nhắn
  • $nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
    5. Giải mã một tin nhắn

Khóa bí mật để mã hóa đối xứng được tạo bằng trình tạo số giả ngẫu nhiên an toàn bằng mật mã

Natri cung cấp một chức năng dễ dàng để tạo khóa với độ dài yêu cầu

$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();

Khóa này phải được lưu trữ an toàn và cũng sẽ được sử dụng để giải mã tin nhắn

Để ngăn chặn các cuộc tấn công phát lại, mỗi tin nhắn được mã hóa phải khác nhau ngay cả khi dữ liệu nguồn giống nhau. Điều này đạt được bằng cách tạo ra một giá trị ngẫu nhiên được gọi là nonce. Giá trị này được sử dụng một lần và được tạo cho mỗi tin nhắn được mã hóa

Một nonce không nhất thiết phải là ngẫu nhiên, nhưng nó phải là duy nhất. Việc sử dụng một giá trị ngẫu nhiên với độ dài phù hợp khiến bạn không cần phải kiểm tra các giá trị nonce hiện có để đảm bảo rằng

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
6 được tạo là duy nhất

Mật mã XChaCha20-Poly1305 yêu cầu nonce và được thực hiện dễ dàng hơn với hằng số tích hợp sẵn

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);

Với

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
7 và
$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
6 được tạo, đã đến lúc mã hóa tin nhắn

$message = 'Hello World';
$encrypted_text = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($message, '', $nonce, $key);

Biến

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
9 hiện giữ tin nhắn được mã hóa. Nó chứa thẻ xác thực (MAC) và Natri tự động sử dụng nó để xác thực một tin nhắn

Tham số thứ hai của

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
5 chấp nhận một
$message = 'Hello World';
$encrypted_text = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($message, '', $nonce, $key);
1 chứa dữ liệu bổ sung. Giá trị này không được mã hóa hoặc lưu trữ cùng với
$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
9, nhưng được sử dụng bổ sung để xác thực. Trong ví dụ này, giá trị này cố tình để màu đen (
$message = 'Hello World';
$encrypted_text = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($message, '', $nonce, $key);
3). Nếu phải sử dụng dữ liệu xác thực bổ sung (chẳng hạn như ID người dùng hoặc địa chỉ IP), hãy sử dụng tham số này

Sau khi văn bản được mã hóa được tạo, nó chứa thẻ xác thực, thẻ này sẽ ngăn chặn việc giả mạo bất ngờ và độc hại đối với văn bản được mã hóa

Cần phải giải mã tin nhắn và phải được lưu trữ cùng với tin nhắn được mã hóa. Một ví dụ về điều này sẽ là khóa

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
7 (bí mật) được lưu trữ trong một tệp chỉ có thể truy cập được đối với quy trình mã hóa/giải mã tin nhắn và
$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
6 (không phải ký tự) và
$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
9 được lưu trữ trong cơ sở dữ liệu

Tùy thuộc vào các giá trị tham số

$message = 'Hello World';
$encrypted_text = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($message, '', $nonce, $key);
8 tại , chúng cũng có thể cần được lưu trữ

Ngoài ra, hàm

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
4 trả về một luồng byte. Nó không thể được in trực tiếp (ví dụ: trên trang web hoặc phản hồi JSON) và phải được chuyển đổi sang định dạng văn bản bằng các chức năng như
echo bin2hex($encrypted_text);
0 hoặc
echo bin2hex($encrypted_text);
1 trước khi in hoặc truyền sang phương tiện không thể xử lý luồng byte thô

echo bin2hex($encrypted_text);

Giải mã một tin nhắn yêu cầu khóa bí mật ban đầu (

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
7) và giá trị Nonce (
$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
6)

$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);

Nếu khóa được cung cấp, nonce hoặc dữ liệu bổ sung không hợp lệ, hàm này sẽ trả về

echo bin2hex($encrypted_text);
4


// Generate a secret key. This value must be stored securely.
$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();

// Generate a nonce for EACH MESSAGE. This can be public, and must be provided to decrypt the message.
$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);

// Text to encrypt.
$message = 'Hello World';

// Encrypt
$encrypted_text = sodium_crypto_aead_xchacha20poly1305_ietf_encrypt($message, '', $nonce, $key);

// Decrypt
$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);

tiện ích mở rộng mcrypt và OpenSSL cũng cung cấp mã hóa đối xứng. Tuy nhiên, chúng có các mức hỗ trợ xác thực, độ dài khóa và độ dài nonce khác nhau

Nói chung, các hàm

echo bin2hex($encrypted_text);
5 là các lựa chọn thay thế tốt hơn cho các hàm
echo bin2hex($encrypted_text);
6 và
echo bin2hex($encrypted_text);
7


Natri cũng cung cấp một cách mã hóa và giải mã tin nhắn bất đối xứng

Mã hóa bất đối xứng liên quan đến hai bên. Cả hai bên tạo một cặp khóa, chứa khóa riêng và khóa chung. Khóa công khai được phân phối cho các bên khác cần giao tiếp với

Ví dụ: nếu Alice và Bob muốn giao tiếp an toàn và phải đảm bảo rằng

  1. Tin nhắn thực sự là từ Alice/Bob chứ không phải từ người khác
  2. Tin nhắn là riêng tư, không ai có thể đọc hoặc giả mạo chúng

Tiện ích mở rộng natri cung cấp API Hộp tiền điện tử đáp ứng tính xác thực và quyền riêng tư của các tin nhắn đó. Trước khi gửi tin nhắn, Alice và Bob (hoặc tất cả các bên liên quan) phải tạo một cặp khóa và trao đổi khóa chung một cách an toàn

Natri cũng cung cấp các giao thức trao đổi khóa an toàn, nhưng nó không được đề cập trong bài viết này

Khi một tin nhắn được gửi đi, người gửi sẽ mã hóa nó bằng khóa công khai của người nhận và ký tên bằng khóa riêng của người gửi. Sau khi tin nhắn được truyền đi, người nhận sẽ xác thực tin nhắn bằng khóa chung của người gửi và giải mã bằng khóa riêng của người nhận

Nếu người nhận không cần xác thực thư đã nhận — đảm bảo rằng thư thực sự được gửi bởi người gửi — Tiện ích mở rộng Natri cũng sử dụng API

extension=sodium
9

Tất cả các bên cần liên lạc phải tạo một cặp khóa. Bí mật phải được giữ kín vì nó được sử dụng để ký và giải mã tin nhắn

Riêng lẻ trên cả thiết bị của Alice và Bob

$alice_keypair = sodium_crypto_box_keypair();
$alice_secret_key = sodium_crypto_box_secretkey($alice_keypair);
$alice_public_key = sodium_crypto_box_publickey($alice_keypair);
$bob_keypair = sodium_crypto_box_keypair();
$bob_secret_key = sodium_crypto_box_secretkey($bob_keypair);
$bob_public_key = sodium_crypto_box_publickey($bob_keypair);
  • echo bin2hex($encrypted_text);
    9 tạo một cặp khóa ngẫu nhiên chứa khóa bí mật X25519 và khóa công khai X25519 tương ứng của nó
  • $original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
    0 trích xuất phần khóa bí mật của cặp khóa
  • $original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
    1 trích xuất khóa công khai của cặp khóa

Để mã hóa và giải mã bất đối xứng được xác thực, cả hai bên liên quan phải trao đổi khóa công khai của họ một cách an toàn. Điều này có thể được thực hiện bằng giao thức trao đổi khóa hoặc truyền khóa bằng một kênh bảo mật khác, chẳng hạn như yêu cầu HTTPS

Natri cung cấp chức năng trao đổi khóa với các chức năng

$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
2 của nó. Tuy nhiên, bài viết này không đề cập đến các API đó tại thời điểm này để đảm bảo tính ngắn gọn của nó

Sau khi trao đổi key thành công

  • Alice phải sở hữu khóa công khai của Alice, khóa riêng của Alice và khóa chung của Bob
  • Bob phải sở hữu khóa công khai của Bob, khóa riêng của Bob và khóa chung của Alice

Tương tự như với mã hóa đối xứng, một tin nhắn bất đối xứng được xác thực cũng phải sử dụng giá trị nonce

Giá trị nonce phải là 192 bit (24 byte), có thể dễ dàng tạo bằng cách sử dụng hàm

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
1 và hằng số
$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
4 tích hợp, được gán ____36_______5

extension=sodium
0

Trước khi mã hóa một tin nhắn, người gửi (Alice trong ví dụ này) phải tạo một cặp khóa mới, chứa khóa chung của người nhận và khóa riêng của người gửi. Điều này có thể được thực hiện bằng cách nối khóa chung và khóa riêng hoặc sử dụng hàm

$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
6

Người gửi

extension=sodium
1

Với , , và , đã đến lúc mã hóa tin nhắn

extension=sodium
2

Hàm

$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
7 mã hóa và ký tin nhắn bằng cặp khóa (
$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
8). Khóa riêng của người gửi được sử dụng để tạo chữ ký và khóa chung của người nhận được sử dụng để mã hóa thư thực. Thẻ xác thực được lưu trữ cùng với văn bản được mã hóa (
$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
9)

Sau khi tin nhắn được mã hóa và ký, chỉ người nhận có khóa riêng mới có thể giải mã tin nhắn. Bất kỳ ai có khóa chung của người gửi đều có thể xác thực thư, nhưng không thể đọc nội dung nếu không có khóa riêng của người nhận

Giá trị nonce

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
6 phải được lưu trữ/truyền đi cùng với bản mã và nó có thể được công khai

Đảm bảo tạo lại giá trị

$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
6 cho thông báo tiếp theo để ngăn chặn các cuộc tấn công phát lại

Người nhận có thể xác thực một tin nhắn và đảm bảo rằng nó được ký bởi người gửi nếu người nhận có khóa chung của người gửi (khóa chung của Alice trong ví dụ này)

extension=sodium
3

Hàm

$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
6 được sử dụng lại để tạo một cặp khóa mới, nhưng lần này, nó được tạo từ khóa riêng của người nhận và khóa chung của người gửi

Khi cặp khóa được tạo, có thể xác thực và giải mã tin nhắn

Hàm


// Generate a secret key. This value must be stored securely.
$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();

// Generate a nonce for EACH MESSAGE. This can be public, and must be provided to decrypt the message.
$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);

// Text to encrypt.
$message = 'Hello World';

// Encrypt
$encrypted_text = sodium_crypto_aead_xchacha20poly1305_ietf_encrypt($message, '', $nonce, $key);

// Decrypt
$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
3 xác thực rằng tin nhắn được ký bởi người gửi (ký bằng khóa riêng của người gửi) và giải mã tin nhắn bằng khóa riêng của người nhận

Nếu có khóa hoặc nonce không khớp,


// Generate a secret key. This value must be stored securely.
$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();

// Generate a nonce for EACH MESSAGE. This can be public, and must be provided to decrypt the message.
$nonce = \random_bytes(\SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);

// Text to encrypt.
$message = 'Hello World';

// Encrypt
$encrypted_text = sodium_crypto_aead_xchacha20poly1305_ietf_encrypt($message, '', $nonce, $key);

// Decrypt
$original_message = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($encrypted_text, '', $nonce, $key);
3 trả về
echo bin2hex($encrypted_text);
4

extension=sodium
4

Nếu người nhận không cần xác thực thư đến mà chỉ cần giải mã chúng, thì đó có thể là trường hợp sử dụng API

extension=sodium
9 của Natri

Các hàm

extension=sodium
9 của Natri được sử dụng để mã hóa và giải mã một tin nhắn bằng một cặp khóa công khai và khóa riêng. Sự khác biệt chính giữa là
extension=sodium
9 không xác thực các tin nhắn

Chức năng

extension=sodium
9 của Natri tương tự như
$alice_keypair = sodium_crypto_box_keypair();
$alice_secret_key = sodium_crypto_box_secretkey($alice_keypair);
$alice_public_key = sodium_crypto_box_publickey($alice_keypair);
1 và
$alice_keypair = sodium_crypto_box_keypair();
$alice_secret_key = sodium_crypto_box_secretkey($alice_keypair);
$alice_public_key = sodium_crypto_box_publickey($alice_keypair);
2 của OpenSSL, trong đó cặp chức năng OpenSSL cũng không cung cấp xác thực

Với

extension=sodium
9, chỉ người nhận mới cần tạo cặp khóa. Người gửi có thể lấy khóa công khai của người nhận và mã hóa tin nhắn

Người nhận có thể giải mã bất kỳ tin nhắn nào được mã hóa bằng khóa chung của nó, nhưng không có cách nào để xác định hoặc xác thực danh tính của người gửi

Với mã hóa bất đối xứng chưa được xác thực, chỉ người nhận được yêu cầu tạo cặp khóa

extension=sodium
5

Người nhận phải giữ phần khóa riêng của cặp khóa được lưu trữ an toàn. Khóa công khai (

$alice_keypair = sodium_crypto_box_keypair();
$alice_secret_key = sodium_crypto_box_secretkey($alice_keypair);
$alice_public_key = sodium_crypto_box_publickey($alice_keypair);
4) sau đó có thể được phân phối qua một kênh an toàn

Cách dễ nhất và phổ biến nhất để phân phối khóa công khai là qua kết nối HTTPS. Ví dụ: người gửi có thể tải xuống khóa công khai của người gửi từ trang web của người nhận được cung cấp qua HTTPS

Lưu ý rằng mặc dù mã hóa bất đối xứng ẩn danh không cung cấp xác thực cho thư, khóa chung phải được truyền an toàn và người gửi phải xác thực khóa chung của người nhận tương ứng với người nhận thực và khóa không bị giả mạo trong quá trình truyền

Với khóa chung của người nhận, bất kỳ người gửi nào cũng có thể mã hóa tin nhắn

extension=sodium
6

Tin nhắn được mã hóa chỉ có thể được mở bởi người nhận giữ khóa riêng. Tuy nhiên, vì không có giá trị xác thực hoặc nonce liên quan nên điều này dễ bị lặp lại các cuộc tấn công

Để giải mã một tin nhắn được mã hóa bằng khóa chung, người nhận phải sở hữu khóa riêng tương ứng

Làm cách nào để mã hóa và giải mã tệp trong PHP?

Làm cách nào để mã hóa và giải mã mật khẩu trong PHP?

Mã hóa mật khẩu. Để tạo hàm băm từ chuỗi, chúng tôi sử dụng hàm password_hash(). .
PASSWORD_DEFAULT
MẬT KHẨU_BCRYPT
PASSWORD_ARGON2I
PASSWORD_ARGON2ID

Làm cách nào để mã hóa và giải mã ID trong PHP?

6 câu trả lời .
$encrypted_id = base64_encode($id);.
$decrypted id = base64 decode($encrypted id);.
$salt="MY_SECRET_STUFF"; . .
$decrypted id = base64 decode($encrypted id);

Làm cách nào để mã hóa và giải mã số nguyên trong PHP?

Trong PHP, có thể mã hóa và giải mã một chuỗi bằng cách sử dụng một trong các Tiện ích mở rộng mã hóa có tên là chức năng OpenSSL để mã hóa và giải mã . Hàm openssl_encrypt(). Hàm openssl_encrypt() dùng để mã hóa dữ liệu. Thông số. dữ liệu $. Nó chứa chuỗi hoặc dữ liệu cần được mã hóa.