2012-03-14 2 views
4

Я сделал пользователь таблица в моей БД с разными столбцами для хранения информации о пользователях. Также я добавил два столбца public_key и private_key. Когда пользователь регистрируется, его информация будет вставлена ​​в таблицу. плюс я использую:как цифровую подпись файла в PHP

// 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? Я вставил свой сгенерированный открытый ключ в signing_cert.pem и частную в 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 

Любое мнение ценится.

ответ

5

Я пришел к выводу о том, почему не сделать свою собственную функцию цифровой подписи.

алгоритм цифровой подписи работает следующим образом: первый простой текст хэшируется, затем он зашифровывается личным ключом пользователя, тогда результат объединяется с простым текстом.

псевдокод:

return [input + encrypt(md5(input),private_key)] 

Для проверки: Input расщепляется в виде простого текста и подписи. то подпись дешифруется с использованием открытого ключа. Затем результат сравнивается с хэшем обычного текста, и если они равны, это означает, что подпись проверена.

псевдо-код:

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"; 
} 
+1

Я предлагаю вернуть только bool, так как это то, что предлагает название функции. – StormByte

+0

Интересно, но что, если в данных появляется '---- ПОДПИСЬ: ----'? – Xenos

1

signed_cert.pem и private_key.pem - это сертификаты, которые вы используете для подписания этого файла. Итак, если у вас есть они хранятся в БД, вам необходимо сбрасывать их в файлы под названием signature_cert.pem и private_key.pem.

Ошибка, которую вы получаете, заключается в том, что openssl пытается загрузить эти файлы, и поскольку они не существуют, он утверждает.

Если вы пишете эти файлы на жесткий диск из вашей БД, Plase TAKE В ВИДЕ:

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

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

Подробнее: PHP openssl_pkc7_sign

+0

Как вы думаете, что это было правильно, что я вставил свой сгенерированный открытый ключ в signing_cert.pem и частный в private_key.pem? – Omidoo

+0

signature_cert.pem выглядит так: ----- НАЧАТЬ ПУБЛИЧНЫЙ КЛЮЧ ----- zzz ... zzz ... ----- END PUBLIC KEY ----- и private_key.pem выглядит как : ----- BEGIN RSA PRIVATE KEY ----- ..z ... ----- END RSA PRIVATE KEY ----- В файле закрытого ключа не должно быть DSA вместо RSA? (Digital Signature Alg.) – Omidoo

+0

Если вы вставили эти файлы, проверьте права доступа к файлам (и в следующий раз сделайте это за пределами корня WWW). – StormByte

Смежные вопросы