Страница 1 из 1

[Php] usb

Добавлено: 2010-10-12 9:25:29
ruslanstep1
Подскажите пожалуйста как можно реализовать такую весч на usb флешки есть некий фаил допустим key так вот на сервоке тотже фаил в mysql допустим есть электронный документ и его нужно подписать чел засовывает свою флешку жмет подписать ключ на флешке проверяется с ключем в БД если подходит все ОК.
Мне весь скрипт не нужен нужен тока по проверки ключевых носителе (флешки) :smile: я просто не знаю как это реализовать. Спасибо

Re: usb

Добавлено: 2010-10-12 10:41:07
Alex Keda
язык какой?

Re: usb

Добавлено: 2010-10-12 11:09:28
ProFTP
ruslanstep1 писал(а):чел засовывает свою флешку жмет подписать ключ на флешке проверяется с ключем в БД если подходит все ОК.
зачем из БД? какой смысл?
ключ должен быть в прогармме закодированный...

Re: usb

Добавлено: 2010-10-12 11:23:17
ruslanstep1
Язык php а БД для сровнения ключа на флехе и БД

Re: usb

Добавлено: 2010-10-12 19:54:20
BSD_daemon
ruslanstep1 писал(а):Язык php а БД для сровнения ключа на флехе и БД
Не совсем понятен метод криптографии, если вы сравниваете что то с чем то, то это симметричное крипто, хотя для подписи обычно используют асимметричный алгоритм, а там все довольно просто, в БД публичный ключ(который и не надо прятать), а на флэхе приватный. Если же симметрия, то сравнивать в лоб ключ с ключом - это дыра, которая легко трассируется.

Re: [Php] usb

Добавлено: 2010-10-13 12:13:54
ruslanstep1
куда тогда надо копать чтоб это реализовать

Re: [Php] usb

Добавлено: 2010-10-13 19:13:50
BSD_daemon
ruslanstep1 писал(а):куда тогда надо копать чтоб это реализовать

Код: Выделить всё

<?php

$data = "***BASF это вовсе не химический концерн, это - Beer And Sex Forever***";

/*********** берем ключи из файлов ******************************
$pubkey1='/mnt/hddname/......../crt/public-key.crt'; // путь к публичному ключу
$prvkey1='/mnt/flashka/......../key/private.key';    // путь к приватному ключу

$fp = fopen($pubkey1, "r");
$public_key = fread($fp, 8192);
fclose($fp);

$fp = fopen($prvkey1, "r");
$private_key = fread($fp, 8192);
fclose($fp);
*****************************************************************/

// ***************** Или можно захардкодить вместо чтения из файлов

$private_key = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
MIIBO...................................
........................................
........................................
..................................ZFb5CI
-----END RSA PRIVATE KEY-----
EOD;
$public_key = <<<EOD
-----BEGIN PUBLIC KEY-----
MFww.....................................................
.........................................................wEAAQ==
-----END PUBLIC KEY-----
EOD;
// ****************************************************************

$binary_signature = "";

// подписываем
openssl_sign($data, $binary_signature, $private_key, OPENSSL_ALGO_MD5);  

echo "<pre>Исходные данные которые будут подписаны:\n--------------------------------\n{$data}\n--------------------------------\n";
echo "Подпись:\n" . chunk_split(base64_encode($binary_signature)) . "\n";


echo "----------- Результат проверка подписи и данных --------------\n";

//$data = $data . '===Левые буковки===';    // проверка искаженных данных
$ok = openssl_verify($data, $binary_signature, $public_key, OPENSSL_ALGO_MD5);

if ($ok == 1) {
    echo "Данные не подменены, то бишь валидные. Подпись тоже валидная(приватный ключ сходятся с публичным)\n";
} elseif ($ok == 0) {
    echo "Какая-то сцука подменила текст, сообщение не валидно\n";
} else {
    echo "Ошибка проверки подписи\n";
}

echo "</pre>";
?>

Re: [Php] usb

Добавлено: 2010-10-14 9:59:42
ruslanstep1
спасибо ща посмотрю :smile:

Re: [Php] usb

Добавлено: 2010-10-14 10:09:02
ruslanstep1
вопрос как сделать эти ключи public-key.crt'; /private.key'; :pardon:

Re: [Php] usb

Добавлено: 2010-10-14 21:10:08
BSD_daemon
ruslanstep1 писал(а):вопрос как сделать эти ключи public-key.crt'; /private.key'; :pardon:
Гхм...
Ну там такая же технология как и в HTTPS.
Читайте здесь:
http://security.ncsa.illinois.edu/resea ... enssl.html
или
http://www.madboa.com/geek/openssl/#cert-self

ключики чтоб побаловаться можете генернуть здесь в онлайн
http://www.mobilefish.com/services/ssl_ ... icates.php

Технология в общем то простая.
Есть центры сертификаци, так называемые CA( - certificate authority ) их задача подтвердить, как третье лицо валидность того, что ключи принадлежат действительно тому, кому они выданы(в зависимости от типа сертификата, валидность может проверяться от банальной проверки по eMail и вплоть до того, что надо будет показать свой паспорт и еще кучу ксив)
Как это работает:
Вы генерируете свой приватный ключ(контент которого никто и никогда не должен увидеть), на его базе генерируется CSR - это как бы будущий ваш публичный ключ и отправляете его в СА, где они за денюшку подпишут его своим ключом, предварительно проверив who you are, после чего вышлют вам подписанный ими ваш публичный ключ, который не есть секрет и может быть расположен публично, но использовать его для раскодировки сможете только вы.
(Грубо говоря это как типа взять рубль, разорвать его на миллиард маленьких клочков, тщательно перемешать и половину оставить у себя, а вторую половину выставить на показ. В этом случае любой может закодировать сообщение вашим публичным ключом, но раскодировать его сможете только вы, так как только у вас есть вторая половина огрызков рубля, которые слепив вместе, можно раскодировать сообщение.)
Т.е. один из ключевых моментов технологии является наличие третьей стороны, подписавшей сертификат. Перед тем как вам отправить сообщение, ваш публичный ключ проверяется с СА, на предмет того, что он действительно принадлежит вам.

Есть два других варианта:
1. Вы не хотите платить до сотни баксов в год, только за то, чтоб СА подписал ваш публичный ключ, тогда вы генерируете self signed сертификат, т.е. вы сами себе становитесь СА и сами же себя подтверждаете. Такой публичный ключ не считается доверяемым, т.к. его никто не перепроверил, а значит его можно в теории подменить.(К сожалению масса российских почтовых серверов работают именно с такими сертификатами, из-за чего приходится пропускать почту с любых таких серваков или поименно заносит их в белые листы)
2. Второй вариант - воспользоваться бесплатным СА, который распознается во всех почтовых клиентах и браузерах. Находится он здесь: http://cert.startcom.org/

Хотя если вы будете использовать сертификаты в замкнутой приватной конторе, то можно обойтись и само-подписанными сертификатами, в этом случае все абоненты просто должны добавить ваш публичный ключ полученный из рук в руки(и под подпись :) ) и добавить его в почтовые клиенты или браузеры вручную как исключение. Если же у вас просто задача - подписывать сообщения, то вам надо просто нагенерировать пары ключей(public/private) для всех абонетов), публичные ключи оставить на централизованном месте(на серваке ?), а приватные ключи раздать клиентам на флэшках(если я правильно понял вашу задачу)

Ну вообщем это все так, - вкраце о несимметричной криптографии ака SSL/TLS, там еще есть прибамбасы и нюансы в виде CRL и прочей херни

Re: [Php] usb

Добавлено: 2010-10-15 7:24:10
ruslanstep1
спасибо большое Вы мне очень помогли :drinks:

Re: [Php] usb

Добавлено: 2010-10-15 18:05:40
ruslanstep1
В общем спасибо большое мне это очень помогла

Код: Выделить всё

<?php
echo'<meta http-equiv="Content-Type" content="text/html; charset=utf-8">';
$data = "прикол прикол";

// открываем ключи
$fp = fopen("/mnt/... /server/private.pem", "r");
$priv_key = fread($fp, 8192);
fclose($fp);
$pkeyid = openssl_get_privatekey($priv_key);

// подписываем
openssl_sign($data, $signature, $pkeyid);

// освабождаем память
openssl_free_key($pkeyid);
echo "<pre>Исходные данные которые будут подписаны:\n--------------------------------\n{$data}\n--------------------------------\n";
echo "Подпись:\n" . chunk_split(base64_encode($signature)) . "\n";

$fp = fopen("/mnt/../flexa/public.pem","r");
$cert = fread($fp, 8192);
fclose($fp);
$pubkeyid = openssl_get_publickey($cert);
// устанавливаем, okay подпись или нет
$ok = openssl_verify($data, $signature, $pubkeyid);
echo "----------- Результат проверка подписи и данных --------------\n";
if ($ok == 1) {
    echo "Данные не подменены, то бишь валидные. Подпись тоже валидная(приватный ключ сходятся с публичным)\n";
} elseif ($ok == 0) {
    echo "Какая-то сцука подменила текст, сообщение не валидно\n";
} else {
    echo "Ошибка проверки подписи\n";
}
openssl_free_key($pubkeyid);
echo "</pre>";
?>
вот теперь все ништяк работает

Re: [Php] usb

Добавлено: 2010-10-15 18:05:58
ruslanstep1
прости помогло