Хорошо, это мой первый опыт работы с шифрованием в проекте. Я использую мой хостинг-провайдер для SSL, но я также хочу зашифровать части чувствительной базы данных. Для этого мне сказали использовать OpenSSL. Я тестирую его на своем localhost (WAMP), и установил OpenSSL и включил мотивы PHP и Apache SSL. Хорошо, поэтому я следил за учебниками и, используя несколько предложенных методов, смог сгенерировать открытый ключ и сохранить его как файл. По какой-то причине я не могу создать секретный ключ. Я отправлю две версии кода, которые я пробовал:
// 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; ?>
Это генерирует файл public.key, но предоставляет мне предупреждения «openssl_pkey_export_to_file (): невозможно получить ключ от параметра 1:» и «openssl_pkey_get_details () ожидает, что параметр 1 будет ресурсом, boolean».
Я также попробовал альтернативный метод:
$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;
Это должно было отражать все, к сожалению, мой результат был пустым личным ключом, прекрасным открытым ключом, открытым текстом и зашифрованным текстом, а также ошибкой при попытке расшифровки: «openssl_private_decrypt (): ключевой параметр не является допустимым закрытым ключом»
Понятно, что у меня проблема с созданием секретного ключа. Я тщательно искал Интернет и не смог его исправить, хотя я реализовал простой код, который, похоже, работает для всех остальных.
Заранее спасибо, Elie Zeitouni
Я думаю, что у вас может быть более легкое время с phpseclib, чистой реализацией PHP RSA . В следующем примере будет создан 1024-разрядный закрытый / открытый ключ RSA:
<?php include('Crypt/RSA.php'); $rsa = new Crypt_RSA(); extract($rsa->createKey()); echo $privatekey . '<br/>' . $publickey; ?>
в<?php include('Crypt/RSA.php'); $rsa = new Crypt_RSA(); extract($rsa->createKey()); echo $privatekey . '<br/>' . $publickey; ?>
Я знаю, что прошло какое-то время, и вы, возможно, уже решили его, но я думаю, что мой ответ может быть полезен другим людям, которые столкнулись с одной и той же проблемой (как и я).
Поэтому, если вы посмотрите на документацию openssl_pkey_export (), вы можете обнаружить, что он принимает четыре разных параметра. Если мы посмотрим на вашу вторую реализацию, мы увидим, что вы предоставили только три.
openssl_pkey_export ($ res, $ privKey, NULL);
Это будет так же хорошо, если только ваш сервер имеет правильные переменные среды для OPENSSL_CONF. Связывание с файлом openssl.cnf, который, как указано в файле README-SSL.txt, загружаемом с помощью XAMPP, требуется для использования функций CSR и генерации ключей из PHP.
Чтобы использовать CSR и функции генерации ключей из PHP, вам нужно будет установить файл openssl.cnf. Мы включили образец файла, который можно использовать для этой цели в этой папке вместе с этим файлом readme.
По этой причине так же, как и для openssl_pkey_new($config);
вы должны создать ассоциативный массив, содержащий config => '/path/to/openssl.cnf'. Именно так:
openssl_pkey_export($res, $privKey, NULL, $config);
Я также хотел бы добавить, что путь openssl.cnf в моем случае находится внутри:
C: \ XAMPP \ PHP \ Extras \ OpenSSL \ openssl.cnf
Здесь вы также сможете найти файл README-SSL.txt, который даст хорошее объяснение того, как настроить OPENSSL.
Надеюсь, поможет. 🙂
Повесил мне голову, чтобы заставить работать на windows10 с xampp php 5.5. Наконец, выяснилось, что ответ табона выше был в правильном направлении. ИСКЛЮЧИТЕЛЬНЫЙ формат пути, который необходимо перерезать!
C:/xampp/php/extras/openssl/openssl.cnf
Надеюсь, это поможет кому-то.
У меня такая же проблема.
И это проблема Windows !!!
Это не произойдет в базовых системах Unix.
И, если вы, как я, используете Windows только для разработки, вы используете PuTTYGen для генерации ключа и используете его, статически, в среде разработки!
ИЛИ
OpenSSL не работает в Windows, ошибки 0x02001003 0x2006D080 0x0E064002
use: openssl_pkey_export_to_file ($ result, 'privkey.pem', null, $ config);