Мне потребовалось написать простенький файлообменник с возможностью шифровать все получаемые файлы на сервере и, соответственно, расшифровывать их при отдаче, но, как ни странно, я не нашел в интернете никаких более менее понятных мне мануалов как это сделать.
Поэтому обращаюсь к вам с вопросом. Как это сделать? Есть готовые функции в PHP?
Я слышал про mcrypt, но он шифрует строковые данные, а мне-то нужно шифровать и файлы, и mp3, и картинки, и все что угодно. Как это сделать?
Спасибо.
UPD: Спасибо за ответы, суть уловил. Шифрую файлы через средства самого linux, но тут другой вопрос появился. Где хранить ключи шифрования? После загрузки файла пользователем я должен буду его зашифровать сгенерированным ключем, но мне его надо где-то хранить, чтобы я потом смог его расшифровать для отдачи. Где его хранить? Хранить в базе на том же сервере мне кажется совсем небезопасным вариантом и тогда вся суть шифрования теряется. Поправьте, если я не прав.
Mellowtoy: тогда в любом случае, компрометация сервера приведет к доступу к файлам, т.к. этот сервер прямым или косвенным образом будет иметь доступ к месту хранения ключей (даже, если они будут храниться где-то ещё), иначе он не будет способен отдавать файлы пользователям. Единственный способ обеспечить сохранность данных - защитить от несанкционированного доступа сам сервер.
Как вариант можно использовать не функции PHP, а что-то из самого линукса, например gpg, вызывая его через shell_exec. Вероятно это не лучшее решение с точки зрения производительности, но для простенького проекта может и подойти.
Спасибо, суть понял. Но где хранить ключи шифрования? После того как человек загрузил файл я должен буду сгенерировать ключ и им зашифровать его файл, но чтобы потом отдать ему расшифрованный вариант мне нужно где-нибудь хранить этот самый ключ, верно же? Если я буду хранить его в базе на том же сервере, то, как мне кажется, вся суть шифрования теряется. Поправьте, если я не прав.
Так же, возможно подойдёт вариант, что шифрование файлов будет происходить на основе кодовой фразы, состоящей, например, из имени пользователя+пароля и сервер не будет хранить никаких данных для расшифровки файлов. ... Только если пользователь забудет свой пароль, то безвозвратно утеряет доступ к своим файлам :)
Дмитрий Шицков: Да, но как в этом случае расшифровать файлы для другого пользователя? Например, если владелец файла решит его расшарить для (дать ссылку) другого чловека?
Можно использовать php.net/manual/ru/function.openssl-encrypt.php
Шифровать каким-нибудь aes-256-cbc. Ключ + вектор генерировать для каждого файла, и отдавать их юзеру, чтобы только он мог забрать файл :)
Mellowtoy:
Если не хотите разбираться с openssl функциями, можно просто через exec вызывать:
openssl enc -aes-256-cbc -salt -in FILE.jpg -out FILE.jpg.enc -k ПАРОЛЬ
И для расшифровки
openssl enc -aes-256-cbc -d -in FILE.jpg.enc -out FILE.jpg -k ПАРОЛЬ