Я сделал таблицу пользователя в моей БД с разными столбцами для хранения информации о пользователях. Также я добавил два столбца public_key и private_key . Когда пользователь регистрируется, его информация будет вставлена в таблицу. плюс я использую:
// Create the keypair $res=openssl_pkey_new(); // Get private key openssl_pkey_export($res, $privatekey); // Get public key $publickey=openssl_pkey_get_details($res); $publickey=$publickey["key"];
для создания пары случайных ключей и предоставления ее пользователю, чтобы каждый пользователь имел пару ключей. Я хочу, чтобы мои пользователи имели способность цифровой подписи, поэтому, когда они загружают файл, они подписывают его.
Я решил сначала подписать пример файла (msg.txt), чтобы узнать, могу ли я продолжить и затем продолжить. Это выглядит прямо:
openssl_pkcs7_sign("msg.txt", "signed.txt", "signing_cert.pem", array("private_key.pem", "mypassphrase"), array() );
Проблема в том, что такое signature_cert.pem и private_key.pem? Я вставил свой сгенерированный открытый ключ в signed_cert.pem и private в private_key.pem, но я вижу эту ошибку:
Warning: openssl_pkcs7_sign() [function.openssl-pkcs7-sign]: error getting private key in /home/ofathian/public_html/msc/ebook/mine/assymetric-test.php on line 40
Любое мнение оценивается.
Я пришел к выводу, почему бы не сделать свою собственную функцию цифровой подписи.
алгоритм цифровой подписи работает так: сначала простой текст хэшируется, тогда он зашифровывается личным ключом пользователя, тогда результат объединяется с простым текстом.
псевдокод:
return [input + encrypt(md5(input),private_key)]
Для проверки: вход разделяется на простой текст и подпись. то подпись расшифровывается с использованием открытого ключа. Затем результат сравнивается с хэшем обычного текста, и если они равны, это означает, что подпись проверена.
псевдокод:
explode(input) --> plain_text , signature if( decrypt(signature,public_key) == md5(plain_text) ) then signature is trusted
Теперь настоящий PHP-код, который я тестировал и в настоящее время использую:
function sign($cleartext,$private_key) { $msg_hash = md5($cleartext); openssl_private_encrypt($msg_hash, $sig, $private_key); $signed_data = $cleartext . "----SIGNATURE:----" . $sig; return mysql_real_escape_string($signed_data); } function verify($my_signed_data,$public_key) { list($plain_data,$old_sig) = explode("----SIGNATURE:----", $my_signed_data); openssl_public_decrypt($old_sig, $decrypted_sig, $public_key); $data_hash = md5($plain_data); if($decrypted_sig == $data_hash && strlen($data_hash)>0) return $plain_data; else return "ERROR -- untrusted signature"; }
signed_cert.pem и private_key.pem – это сертификаты, которые вы используете для подписания этого файла. Поэтому, если вы их сохранили в БД, вам необходимо сбрасывать их в файлы под названием signature_cert.pem и private_key.pem.
Ошибка, которую вы получаете, заключается в том, что openssl пытается загрузить эти файлы, и поскольку они не существуют, он утверждает.
Если вы записываете эти файлы на жесткий диск из своей базы данных, plase TAKE IN MIND:
Кроме того, вместо того, чтобы иметь эти сертификаты в БД, вы можете хранить их в какой-либо папке для каждого пользователя, чтобы предотвратить списание файла при подписании. Конечно, эта папка не должна быть доступной никому.
Дополнительная информация: PHP openssl_pkc7_sign