Зашифровать большой объем данных в PHP

Я разрабатываю программное обеспечение, которое должно шифровать данные, прежде чем отправлять их другому экземпляру того же программного обеспечения (которое, конечно, должно его расшифровать). Я сначала использую openssl_public_encrypt/openssl_private_decrypt, вот так

foreach(str_split($sData, MAXSIZE) as $sChunk)
{
    if( ! @openssl_public_encrypt($sChunk, $crypted, $sPublicKey)) throw new Exception('openssl_public_encrypt');
    $aCrypted[] = $crypted;
}

и

$sResult = '';
foreach($aCrypted['data'] as $ct => $sChunkCrypted)
{
    if( ! openssl_private_decrypt($sChunkCrypted, $sChunk, $sPrivateKey)) throw new Exception("decrypt");
    $sResult .= $sChunk;
}

потому что блок данных для шифрования не может быть больше ключа, но часть расшифровки занимает слишком много времени (xdebug говорит мне, что это вызовы openssl_private_decrypt(), которые занимают все время).

Я пытаюсь использовать симметричные алгоритмы mcrypt_decrypt/MCRYPT_RIJNDAEL_256 (с openssl для шифрования ключа), но это хуже. Что я могу сделать для безопасной передачи больших объемов данных? Файлы представляют собой CSV (текст) и размещаются на сервере SSH/SFTP, они должны быть зашифрованы.

Спасибо,
Седрик


person Cédric Girard    schedule 19.07.2011    source источник
comment
Почему бы не использовать SCP?   -  person Michael Mior    schedule 19.07.2011
comment
Потому что мне нужно шифровать данные, даже если копирование между серверами защищено, а SFTP не менее безопасен, чем SCP. Правильно?   -  person Cédric Girard    schedule 20.07.2011
comment
Конечно, SFTP тоже подойдет. Если вам нужно зашифровать хранимые данные, почему бы не сделать это на уровне файловой системы? Если производительность является проблемой, это должно быть намного быстрее, чем все, что вы могли бы приготовить на PHP. Если это похоже на то, что вы хотите изучить, проверьте eCryptfs.   -  person Michael Mior    schedule 20.07.2011
comment
На самом деле несколько серверов помещают и получают файлы на сервер хранения (своего рода ящик для обмена сообщениями), и только адресат файла может его прочитать. Так что асимметричное шифрование кажется хорошим выбором.   -  person Cédric Girard    schedule 20.07.2011
comment
Это возможно с eCryptfs.   -  person Michael Mior    schedule 20.07.2011


Ответы (1)


Просто используйте SCP или SFTP. Они будут использовать SSL для фактической передачи данных, так что вы получите шифрование автоматически. Если вам нужно ХРАНИТЬ файлы в зашифрованном состоянии, вам придется использовать mcrypt и его друзей, чтобы сделать шифрование за вас.

Что касается «данные должны быть меньше, чем ключ», применяется только в ситуации с одноразовым блокнотом. Современные шифры, по сути, всегда имеют ключи, которые меньше, чем зашифрованные данные ... подумайте о большом файле RAR или ZIP - несколько мегабайт данных, но ключ (пароль) размером всего в несколько символов.

person Marc B    schedule 19.07.2011
comment
SCP/SFTP предназначен для передачи, но данные должны быть зашифрованы, если сервер хранения скомпрометирован. Mcrypt медленнее, чем асимметричные ключи (но я, возможно, неправильно его использую). И данные должны быть меньше, чем ключ по-прежнему подходит для библиотеки openssl, используемой PHP. exec() не всегда доступен на серверах моих клиентов, и я уверен, что GPG/PGP или ZIP/RAR/GZ/BZ2/... шифруют данные небольшими порциями, как я. Если я совершенно не прав, пожалуйста, помогите мне понять, как это сделать в соответствии с моими потребностями. - person Cédric Girard; 20.07.2011