2014-07-01 13 views
5

Tôi đã được đọc rất nhiều về GCM và làm thế nào tuyệt vời nó là gì và tôi muốn biết làm thế nào tôi có thể sử dụng AES-GCM mã hóa chứng thực sử dụng PHP. Được hỗ trợ trong mcrypt()? Tôi đã tìm thấy một số tham chiếu đến GCM trong tài liệu khung Codeigniter dẫn tôi tin rằng có thể sử dụng trong Codeigniter.Làm cách nào để chúng tôi có thể sử dụng mã hóa chế độ GCM trong PHP?

Và tôi cũng đã xem qua nội dung nào đó trong tài liệu về Zend. Tôi không muốn sử dụng trình điều khiển Codeigniter mặc dù tôi không sử dụng bất kỳ khung công tác nào và không có ý định cho các dự án hiện tại của mình. Dường như với tôi tuy nhiên, nếu Codeigniter có thể làm điều đó thì chúng ta có thể không có khuôn khổ.

Dường như là GCM là cách để bảo mật cũng như hiệu suất (tôi đã thấy các con số hiệu suất rất ấn tượng). Cảm giác của tôi là chúng tôi cần điều này nhưng tôi không thể tìm thấy bất kỳ ví dụ nào. Ai đó phải có ý tưởng về cách thực hiện điều này. Tôi biết nó được hỗ trợ bởi OpenSSL.

Mọi trợ giúp sẽ được đánh giá cao.

+1

Xin lỗi, nhưng GCM không làm việc với PHP. Nếu bạn cần một chế độ AEAD, hãy xem [libsodium] (https://github.com/jedisct1/libsodium-php). –

+1

Cảm ơn bạn. Tôi đã làm gió lên bằng cách sử dụng libsodium trong mã của tôi. Nó rất thẳng về phía trước. – xendi

Trả lời

4

Bạn đặt một số câu hỏi tại đây, vì vậy tôi sẽ giải quyết chúng tương tự như đã nêu ở trên:

Được hỗ trợ trong mcrypt()?

Không, mcrypt không hỗ trợ mã hóa AES. Nó, tuy nhiên, hỗ trợ Rijndael (phát âm như 'mưa-búp bê'), đó là thuật toán cơ sở cho AES. AES được định nghĩa là một tập hợp các thông số cụ thể cho Rijndael, vì vậy bạn có thể sử dụng các tham số thích hợp để phù hợp với AES, nhưng chế độ GCM không có sẵn.

Dường như GCM là con đường để đảm bảo an ninh cũng như hiệu suất (tôi thấy số liệu hiệu suất rất ấn tượng). Cảm giác của tôi là , chúng tôi cần điều này nhưng tôi không thể tìm thấy bất kỳ ví dụ nào.

Thật không may, đây là cách sai để chọn lựa một mô hình hoặc triển khai bảo mật. Các thuật toán và chế độ mã hóa khác nhau có cách sử dụng khác nhau và áp dụng chế độ sai, ví dụ, có thể khiến ứng dụng của bạn dễ bị tấn công ngay cả khi bạn đang sử dụng một mật mã mạnh như AES. GCM bị tắt tiếng rất tốt vì chế độ này cung cấp mã hóa và xác thực trong một lần chụp. Không phải tất cả các ứng dụng đều cần cả hai hoặc có thể sử dụng chúng theo cách làm suy yếu sức mạnh thiết kế của chúng. Bạn sẽ cần phải làm bài tập ở nhà của bạn để đảm bảo đây là chế độ chính xác để sử dụng cho ứng dụng của bạn và các thông số tối thiểu hiện tại để sử dụng là gì.

Trừ khi bạn là một chuyên gia bảo mật, bạn tốt hơn nhiều bằng cách sử dụng một khuôn khổ đã được chứng minh. Nó không bao giờ là một ý tưởng tốt để thực hiện mã hóa của riêng bạn hoặc quản lý an ninh bởi vì nó rất dễ dàng để làm cho những sai lầm có thể để bạn mở rộng để tấn công đơn giản. Tùy chọn tốt nhất là tìm một khung công tác nguồn mở, đã được chứng minh và thử nghiệm, thực hiện những gì bạn muốn thực hiện và cấu hình cẩn thận nó cho phù hợp với nhu cầu của bạn. Sau đó, nó là chìa khóa để giữ cho khuôn khổ vá và cập nhật.

Vì bạn đề cập đến thống kê hiệu suất cho AES-GCM, có, nó hoạt động rất tốt trên các CPU hiện đại (i7 và mới hơn), có hỗ trợ phần cứng được thiết kế đặc biệt để tăng tốc các thao tác cần thiết. Nếu máy chủ hoặc khách hàng của bạn không có khả năng tăng tốc phần cứng, AES-GCM sẽ chậm hơn nhiều. Ngoài hỗ trợ phần cứng thực tế, thư viện phần mềm bạn sử dụng là chìa khóa, bởi vì nó sẽ cần phải gọi phần cứng cần thiết để tận dụng lợi thế của tốc độ tăng lên.

Tôi biết nó được OpenSSL hỗ trợ.

OpenSSL là một trong những thư viện đó mà thực hiện AES-GCM và nó tận dụng lợi thế nếu AES-NI (phần cứng công nghệ tăng tốc) khi có sẵn.

Tin xấu là các phần mở rộng PHP hiện nay (đầu tháng 2 năm 2015) không hỗ trợ thư viện cụ thể mà thực hiện AES-GCM. Sự vội vàng sử dụng GCM bắt nguồn từ các lỗ hổng gần đây được tìm thấy trong giao thức SSL, điều này cuối cùng buộc tất cả mọi người phải di chuyển sang TLS và đến chế độ mã hóa có xác thực. Mặc dù các chuyên gia bảo mật đã thúc đẩy một động thái như vậy trong nhiều năm, cả hai máy chủ và các nhà sản xuất trình duyệt đều đã kéo chân của họ chờ đợi nhau để thực hiện các bước đầu tiên hướng tới Mã hóa được xác thực. Chúng tôi cuối cùng cũng bắt đầu thấy chuyển động đúng hướng.

Tôi tin rằng vào cuối năm nay chúng tôi sẽ cuối cùng có AES-GCM trong PHP, nhưng bây giờ nó không phải là tự do sẵn có.

Một số nguồn thông tin: http://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption Hiển thị thư viện EVP. Triển khai cấp cao AES-GCM tận dụng lợi thế của AES-NI

http://phpaes.com Triển khai AES cho PHP. Tôi không biết nếu họ đã được kiểm tra đúng cách, hoặc nếu họ sử dụng tăng tốc phần cứng. Họ không cung cấp GCM, nhưng nó có thể là một công cụ học tập tốt.

2

Bạn có thể thiết lập các chế độ như một tham số cho hàm khởi tạo:

$this->encryption->initialize(
     array('mode' => 'gcm') 
); 

sử dụng mã này, bạn có sử dụng nhiên ci và đó là lớp mã hóa

$this->load->library('encryption'); 

bạn cũng có thể thay đổi mật mã , trình điều khiển và khóa bên trong phương thức khởi tạo - để biết thêm thông tin, hãy xem http://www.storycon.us/ci3/libraries/encryption.html#id11

+5

Hãy làm rõ rằng bạn trả lời là về thư viện CodeIgniter [Encryption] (http://www.storycon.us/ci3/libraries/encryption.html). Nó không phải là ngay lập tức rõ ràng nếu không thì tại sao có một 'mã hóa' tài sản trên' này' và người chính xác hỗ trợ chế độ 'gcm'. –

+0

@OlegEstekhin Tôi nghĩ, điều đó đã rõ ràng, bởi vì tác giả đã liên kết trang cipu coresponding ci – Philipp

1

OpenSSL sẽ không hoạt động chính xác như AEAD không được hỗ trợ cho tất cả các phiên bản trước khi PHP 7.1.

Bạn có thể sử dụng thư viện này: https://github.com/Spomky-Labs/php-aes-gcm

Đây là thư viện PHP thuần túy. Mã hóa/Giải mã có thể chậm hơn một phần mở rộng PHP, nhưng nó thực hiện công việc. Thư viện này cũng được kiểm tra bằng cách sử dụng các vectơ thử nghiệm từ NIST.

Các vấn đề liên quan