2013-05-31 55 views
5

Được rồi, đây là lần đầu tiên tôi làm việc với mã hóa trên một dự án. Tôi đang sử dụng nhà cung cấp dịch vụ lưu trữ của mình cho SSL, nhưng tôi cũng muốn mã hóa các phần của cơ sở dữ liệu nhạy cảm. Vì điều này, tôi được yêu cầu sử dụng OpenSSL. Tôi đang thử nghiệm nó trên localhost của tôi (WAMP), và đã cài đặt OpenSSL và bật các PHP và Apache SSL mods. Được rồi, vì vậy tôi đã làm theo hướng dẫn và, bằng cách sử dụng một số phương pháp được đề xuất, đã có thể tạo khóa công khai và lưu trữ nó dưới dạng tệp. Vì lý do nào đó, tôi dường như không thể tạo khóa riêng. Tôi sẽ gửi hai phiên bản của mã mà tôi đã cố gắng:OpenSSL sẽ không tạo khóa riêng tư?

// generate private key 
$privateKey = openssl_pkey_new(array(
    'private_key_bits' => 1024, 
    'private_key_type' => OPENSSL_KEYTYPE_RSA, 
)); 
// write private key to file 
openssl_pkey_export_to_file($privateKey, 'private.key'); 
// generate public key from private key 
$publicKey = openssl_pkey_get_details($privateKey); 
// write public key to file 
file_put_contents('public.key', $publicKey['key']); 
// clear key 
echo $privateKey; 

?> 

này tạo ra một tập tin public.key, nhưng cung cấp cho tôi những lời cảnh báo "openssl_pkey_export_to_file(): không thể có được chìa khóa từ thông số 1:" và "openssl_pkey_get_details () hy vọng tham số 1 là tài nguyên, boolean. "

Tôi cũng đã cố gắng một phương pháp khác:

$config = array(
    "config" => "E:/wamp/bin/apache/apache2.2.22/conf/openssl.cnf", 
    "digest_alg" => "sha512", 
    "private_key_bits" => 1024, 
    "private_key_type" => OPENSSL_KEYTYPE_RSA, 
); 

// Create the private and public key 
$res = openssl_pkey_new($config); 

// Extract the private key from $res to $privKey 
openssl_pkey_export($res, $privKey, NULL); 
echo "Private Key: ".$privKey; 
// Extract the public key from $res to $pubKey 
$pubKey = openssl_pkey_get_details($res); 
$pubKey = $pubKey["key"]; 
echo "Public Key: ".$pubKey; 
$data = 'plaintext data goes here'; 
echo "Data: ".$data; 
// Encrypt the data to $encrypted using the public key 
openssl_public_encrypt($data, $encrypted, $pubKey); 
echo "Encrypted: ".$encrypted; 
// Decrypt the data using the private key and store the results in $decrypted 
openssl_private_decrypt($encrypted, $decrypted, $privKey); 

echo "Decrypted: ".$decrypted; 

này được cho là để echo tất cả mọi thứ, không may kết quả của tôi là một chìa khóa trống riêng, chìa khóa công cộng tốt, rõ, và văn bản được mã hóa, và một lỗi khi cố gắng để giải mã: "openssl_private_decrypt(): thông số khóa không phải là khóa riêng hợp lệ"

Rõ ràng, tôi đang gặp sự cố với tạo khóa cá nhân. Tôi đã tìm kiếm trên Internet kỹ lưỡng và không thể sửa chữa nó, mặc dù tôi đã triển khai mã đơn giản mà dường như làm việc cho mọi người khác.

Cảm ơn trước, Elie Zeitouni

+0

Bạn đã kiểm tra giá trị trả về của hàm chưa? – doptimusprime

Trả lời

2

Tôi nghĩ rằng bạn có thể có một thời gian dễ dàng hơn với phpseclib, a pure PHP RSA implementation. Ví dụ sau sẽ tạo khóa riêng tư/công khai RSA 1024 bit:

<?php 
include('Crypt/RSA.php'); 

$rsa = new Crypt_RSA(); 

extract($rsa->createKey()); 

echo $privatekey . '<br/>' . $publickey; 
?> 
+0

Cảm ơn! Điều đó chỉ giải quyết vấn đề của tôi :) –

2

Tôi đã gặp phải vấn đề tương tự.

Và đó là vấn đề của Windows !!!

Nó sẽ không xảy ra trên các hệ thống cơ sở Unix.

Và, nếu như tôi bạn chỉ sử dụng Windows cho Phát triển, bạn sử dụng PuTTYGen để tạo khóa và sử dụng nó, tĩnh, trong môi trường dev!

HOẶC

OpenSSL not working on Windows, errors 0x02001003 0x2006D080 0x0E064002

5

Tôi biết rằng nó đã được một thời gian và bạn có thể đã giải quyết nó nhưng tôi nghĩ rằng câu trả lời của tôi có thể hữu ích cho những người khác, những người phải đối mặt với cùng một vấn đề (Giống như tôi đã làm).

Vì vậy, nếu bạn xem qua tài liệu openssl_pkey_export(), bạn có thể thấy rằng cần có bốn tham số khác nhau. Nếu chúng ta xem xét triển khai thứ hai của bạn, chúng tôi có thể thấy rằng bạn chỉ cung cấp ba.

openssl_pkey_export ($ res, $ privKey, NULL);

Điều này sẽ ổn nếu chỉ máy chủ của bạn có các biến môi trường phù hợp cho OPENSSL_CONF. Liên kết tới tệp openssl.cnf, được trích dẫn trong tệp README-SSL.txt được tải xuống bằng XAMPP là bắt buộc để sử dụng CSR và các hàm tạo khóa từ PHP.

Để sử dụng CSR và các chức năng tạo khóa từ PHP, bạn sẽ cần phải cài đặt tệp openssl.cnf. Chúng tôi đã bao gồm một tệp mẫu có thể được sử dụng cho mục đích này trong thư mục này cùng với tệp readme này.

Vì lý do này giống như bạn đã thực hiện đối với openssl_pkey_new($config);, bạn phải tạo một mảng kết hợp chứa cấu hình => '/path/to/openssl.cnf'. Chỉ cần như thế này:

openssl_pkey_export($res, $privKey, NULL, $config); 

Tôi muốn cũng nói thêm rằng con đường của openssl.cnf trong trường hợp của tôi là bên trong:

C: \ xampp \ php \ extras \ openssl \ openssl.cnf

Bên trong ở đây bạn cũng sẽ có thể tìm thấy tệp README-SSL.txt cung cấp giải thích tốt về cách định cấu hình OPENSSL.

Hy vọng điều đó sẽ hữu ích. :)

3

Vuốt quanh đầu tôi bằng cách làm việc này trên windows10 với xampp php 5.5. Cuối cùng figured câu trả lời của tabone ở trên là đúng hướng định dạng đường dẫn EXCEPT cần thiết để được chuyển tiếp cắt giảm!

C:/xampp/php/extras/openssl/openssl.cnf 

Hy vọng điều này sẽ giúp ai đó.

1

sử dụng: openssl_pkey_export_to_file ($ result, 'privkey.pem', null, $ config);