как цифровая подпись файла в PHP

Я сделал таблицу пользователя в моей БД с разными столбцами для хранения информации о пользователях. Также я добавил два столбца 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:

    1. НЕ храните его в любой общедоступной папке (не используйте DOCUMENT_ROOT AND temp directory). Специально для секретного ключа, чтобы избежать проблем безопасности.
    2. Удалите их, когда закончите.

    Кроме того, вместо того, чтобы иметь эти сертификаты в БД, вы можете хранить их в какой-либо папке для каждого пользователя, чтобы предотвратить списание файла при подписании. Конечно, эта папка не должна быть доступной никому.

    Дополнительная информация: PHP openssl_pkc7_sign