Hướng dẫn php encrypt files on server - php mã hóa tập tin trên máy chủ

Nếu bạn xử lý dữ liệu nhạy cảm, việc mã hóa các tệp trước khi lưu trữ chúng trên máy chủ hoặc lưu trữ đám mây. Hãy cùng xem cách mã hóa và giải mã các tệp trong PHP với chức năng openssl_encrypt.

Mã hóa các tệp bằng cách sử dụng PHP

🚫 Don Tiết chuyển toàn bộ nội dung cho openssl_encrypt

Hàm openssl_encrypt rất đơn giản để sử dụng: bạn truyền một chuỗi và khóa (cũng như thuật toán để sử dụng và vectơ khởi tạo) và nó trả về phiên bản được mã hóa của chuỗi của bạn.

Bạn có thể nghĩ rằng tất cả những gì bạn phải làm là chuyển toàn bộ nội dung tệp vào openssl_encrypt để có được nội dung được mã hóa. Tuy nhiên, đây là một ý tưởng tồi vì nó sẽ tải toàn bộ tệp vào bộ nhớ, cũng như phiên bản được mã hóa.

Nếu bạn muốn mã hóa một tệp 30m, yêu cầu PHP của bạn sẽ sử dụng ít nhất 60m bộ nhớ. Với các tệp lớn hơn, bạn có nguy cơ vượt quá giới hạn bộ nhớ PHP.

Hãy để thử mã sau với tệp 30m. Nó tải toàn bộ nội dung tệp với file_get_contents() và chuyển nó sang openssl_encrypt().

Cách không mã hóa tệp trong PHP
➜ php encrypt_file.phpFile encrypted!
Memory usage: 64.98M

64,98m được phân bổ cho PHP. Điều đó có nghĩa là mã này đã giành được công việc với các tệp lớn vì chúng tôi sẽ vượt quá giới hạn bộ nhớ PHP.this code won’t work with large files since we’ll exceed the PHP memory limit.

✅ Mã hóa các khối nhỏ hơn của một tệp lớn

Để tránh tải một tệp lớn vào bộ nhớ, thực tiễn tốt nhất là mã hóa các khối nhỏ hơn của tệp, từng phần khác và viết chúng vào một tệp khác.

1. Tạo một vectơ khởi tạo ngẫu nhiên (iv)

Như bạn có thể biết, khi chúng ta sử dụng openssl_encrypt() hoặc openssl_decrypt(), chúng ta cần truyền một vectơ khởi tạo không null. Hãy để tạo ra một cái ngẫu nhiên bằng cách sử dụng

➜ php encrypt_file.phpFile encrypted!
Memory usage: 0.38M
0.

2. Lưu trữ IV này ở đầu tệp được mã hóa

Chúng tôi có thể giải mã bất cứ thứ gì mà không cần IV, vì vậy chúng tôi phải lưu trữ IV này ở đâu đó để chúng tôi có thể giải mã nội dung sau này. Nó không phải là một thông tin bí mật như khóa mã hóa, vì vậy chúng tôi có thể lưu trữ nó ở đầu tệp được mã hóa.

3. Lấy một đoạn đầu tiên, mã hóa nó với IV và lưu trữ nó

Bây giờ chúng ta có một IV ngẫu nhiên, chúng ta có thể lấy một đoạn đầu tiên của tệp PlainText và mã hóa nó, sau đó lưu trữ nó ở cuối tệp được mã hóa.

4. Sử dụng các ký tự đầu tiên của đoạn được mã hóa cho IV tiếp theo

Ý tưởng là thay đổi IV cho mỗi mã hóa chunk. IV tiếp theo sẽ luôn là nhân vật đầu tiên của đoạn được mã hóa cuối cùng.

5. Lấy phần tiếp theo và lặp lại bước 3

Cách mã hóa một tệp trong PHP
➜ php encrypt_file.phpFile encrypted!
Memory usage: 0.38M

Đối với cùng một tệp, lần này lấy bộ nhớ 0,38m để mã hóa nó. Điều này tốt hơn nhiều so với 64,98m của cách tiếp cận đầu tiên của chúng tôi!

Để giải mã tệp, chúng ta chỉ cần thực hiện thao tác ngược.

Cách giải mã một tệp trong PHP

Mã đầy đủ

Cách mã hóa và giải mã một tệp trong PHP

Description:

Tôi muốn tạo một trung tâm tải lên cho các tệp nhỏ (tài liệu Word/Excel/Zip, v.v.) với PHP.

  1. Tôi muốn bảo vệ các tệp được người dùng tải lên càng nhiều càng tốt, vì vậy nếu máy chủ bị vi phạm, kẻ tấn công không thể đọc/mở các tệp này.
  2. Tôi chỉ muốn giảm thiểu thiệt hại trong trường hợp vi phạm/tấn công.
  3. Nếu tất cả các tệp được mã hóa đều bị vi phạm và không thể giải mã được thì không sao
  4. Có thể chấp nhận được nếu trong trường hợp xấu nhất, một vài tệp bị vi phạm (không được mã hóa) hoặc thậm chí các tệp cho một vài người dùng, nhưng không phải tất cả các tệp cùng một lúc, v.v. (như tôi đã nói, chỉ cố gắng giảm thiểu thiệt hại).
  5. Trong trường hợp tốt nhất, chỉ có người dùng (người đã tải lên các tệp) có thể truy cập các tệp (không mã hóa) của riêng mình, nhưng không sao nếu quản trị viên cũng có thể đọc chúng.

Điều tôi đã nghĩ đến:

  1. Đầu tiên tôi nghĩ rằng có một mật khẩu ngẫu nhiên được tạo cho mỗi tệp, lưu trữ mật khẩu đó trong cơ sở dữ liệu nhưng trước khi lưu trữ chúng, các mật khẩu đó cũng được mã hóa bởi mật khẩu chính được xác định bởi quản trị viên. Nhưng nếu máy chủ bị vi phạm, kẻ tấn công cũng có thể có quyền truy cập vào cả mật khẩu và tệp và nó chỉ mang lại cho anh ta thêm một chút nỗ lực ... có vẻ như cảm giác bảo mật sai lầm.
  2. Sau đó, tôi nghĩ rằng mỗi người dùng, có thể có mật khẩu mã hóa thứ cấp, được lưu trữ trong
    ➜ php encrypt_file.phpFile encrypted!
    Memory usage: 0.38M
    1 (trước khi lưu trữ trong phiên, nó được mã hóa bằng khóa tạm thời ngẫu nhiên), mật khẩu
    ➜ php encrypt_file.phpFile encrypted!
    Memory usage: 0.38M
    1 chỉ được sử dụng để mã hóa và giải mã các tệp. Nhưng trong trường hợp người dùng muốn thay đổi mật khẩu này, chúng tôi phải viết lại tất cả các tệp được mã hóa cũ hơn ... hoặc lưu mật khẩu cũ trên cơ sở dữ liệu và mã hóa nó bằng mật khẩu mới để sử dụng cho các tệp cũ đó! mà làm cho mọi thứ trở nên phức tạp.

Có cách nào tốt hơn để làm điều này với một máy chủ duy nhất và không có phần cứng bổ sung?

Có ý tưởng nào của tôi cung cấp bảo mật tối thiểu (tốt nhất tôi có thể) mà tôi đang tìm kiếm không?

Hỏi ngày 12 tháng 12 năm 2019 lúc 14:18Dec 12, 2019 at 14:18

Hướng dẫn php encrypt files on server - php mã hóa tập tin trên máy chủ

7