реализация криптографии с открытым ключом
-
22-07-2019 - |
Вопрос
Я использую модуль PHP mcrypt для шифрования конфиденциальных данных в своей компании.Это работает хорошо.Однако меня попросили создать новый мастер-пароль, который должен позволять расшифровывать любые данные.Проблема в том, что этот мастер-пароль должен быть жестко закодирован в файле сценария.Пожалуйста, поправьте меня, если я ошибаюсь, но, по-видимому, единственный безопасный способ - это жестко закодировать открытый ключ в скрипте и использовать его для шифрования данных, сохраняя при этом закрытый ключ в безопасности и используя его для расшифровки только при необходимости.
mcrypt, похоже, не имеет реализации для такой схемы.Кто-нибудь знает библиотеку (PHP-модуль или чистый PHP), которая могла бы это сделать?
Решение
Я предлагаю взглянуть на привязки PHP OpenSSL и, в частности, на функцию openssl_public_encrypt () . Вы действительно можете встроить главный открытый ключ в сценарий, и сценарий зашифрует ключ AES каждого пользователя с помощью этого открытого ключа. Храните соответствующий главный закрытый ключ в сейфе компании.
Если вам понадобится основная функция дешифрования, вы извлечете зашифрованный пользовательский ключ, расшифруете его с помощью главного закрытого ключа, а затем расшифруете исходные данные.
Другие советы
Для этого есть расширение PECL. http://us2.php.net/manual/en/book.gnupg. PHP р>
Вы также можете использовать инструмент командной строки gnupg из php, если он не должен быть очень быстрым: http://devzone.zend.com/article/1265 р>
Я не пробовал ни один из этих способов.
Я не понимаю, как это будет работать. Любая двусторонняя функция шифрования будет расшифровываться только при подаче определенного пароля, используемого для шифрования (если только вы не являетесь АНБ и не отошли в алгоритмы). У вас не может быть двух паролей, расшифровывающих один и тот же файл (если только нет коллизий хешей, но это не так легко сделать).
Что касается хранения вашего мастер-пароля в программе, было бы гораздо лучше хранить его в отдельном файле, который читает программа, так что вы можете использовать более строгую защиту на уровне ОС для этого файла.
Имейте в виду, что mcrypt не является криптографией с открытым ключом. Однако с помощью криптографии с открытым ключом вы можете делать то, что хотите. Например, с PGP / GPG вы можете зашифровать файл так, чтобы три разных пользователя могли расшифровать его, используя свои личные ключи, не зная личных ключей друг друга. Таким образом, у вас может быть виртуальный пользователь с мастер-паролем, который может расшифровать все.
Другой вариант - хранить две копии всех зашифрованных данных; один зашифрован паролем пользователя, а другой зашифрован мастер-паролем.
Просто чтобы быть уверенным в вашем требовании этого мастер-пароль,
- Ожидается ли, что он будет использоваться только как '
encrypt this
"команда, которая что-то "запечатает"
который затем может быть открыт только тем, кто знает секретный ключ, о котором идет речь?Или,- Вы ожидаете, что это откроет любое шифрование, выполненное на предприятии?
- Я просто хочу быть уверен, что ваша формулировка не должна быть истолкована таким вторым способом
- твоя фраза '
decrypt any data
- звучит опасно
(и неосуществимо / практично при шифровании с асимметричным ключом)
Обновление на основе комментария.
- Вы планируете две копии данных каждый зашифрован разными ключами
- один экземпляр должен быть зашифрован с помощью главная публика Клавиша
- может быть расшифрован любым пользователем, имеющим мастер-рядовой Клавиша
затем главный закрытый ключ должен быть защищен (открытый ключ не является критичным).
- может быть расшифрован любым пользователем, имеющим мастер-рядовой Клавиша
- тот самый вторая копия должен быть зашифрован с помощью
Rijndael 256
Клавиша
- один экземпляр должен быть зашифрован с помощью главная публика Клавиша
- цель состоит в том, чтобы позволить ведущему устройству расшифровывать данные всякий раз, когда это необходимо
особенно в отсутствие человека, который его зашифровал
Этот подход будет работать для,
легкого доступа к данным для человека с ключом Rijndael,
без необходимости вмешательства владельца главного закрытого ключа.
И когда владельцу главного закрытого ключа доверяют секретность данных.
Вашей схеме необходимо будет обновлять основную копию (удаляя старую и повторно шифруя новую) каждый раз, когда пользователь обновляет свою копию.
Однако, если пользовательские данные доверяются ведущему (как, очевидно, и в данном случае),
- более простой подход было бы выдать ключ Rijndael от мастера
- Мастер мог бы сохранить его зашифрованным с помощью самого главного открытого ключа
- Затем данные могут быть зашифрованы только с помощью выданного ключа Rijndael
- он всегда будет доступен с помощью мастер-закрытого ключа
который может открыть ключ пользователя Rijndael
- он всегда будет доступен с помощью мастер-закрытого ключа
Если пользователю необходимо подписать данные, это может быть сделано отдельно в процессе.
Это избавит вас от необходимости создавать двойные копии и поддерживать их в рабочем состоянии.
Чтобы подписать данные, пользователь может иметь сгенерированную им пару ключей.
- Перед шифрованием данных с помощью закрытого ключа Rijndael
- тот самый мастер-открытый ключ зашифрованный с помощью пользователь-закрытый ключ может быть добавлен к нему
- тот самый открытый ключ пользователя поделился с мастером (по крайней мере)
будет достаточно для подтверждения того, что пользователь предоставил данные - В худшем случае, если пользователь недоступен и не удается подтвердить ключ,
ведущему устройству можно доверять в отношении подлинности данных, которые все еще могут быть расшифрованы