Вопрос

Я использую модуль 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 вы можете зашифровать файл так, чтобы три разных пользователя могли расшифровать его, используя свои личные ключи, не зная личных ключей друг друга. Таким образом, у вас может быть виртуальный пользователь с мастер-паролем, который может расшифровать все.

Другой вариант - хранить две копии всех зашифрованных данных; один зашифрован паролем пользователя, а другой зашифрован мастер-паролем.

Просто чтобы быть уверенным в вашем требовании этого мастер-пароль,

  1. Ожидается ли, что он будет использоваться только как 'encrypt this"команда, которая что-то "запечатает"
    который затем может быть открыт только тем, кто знает секретный ключ, о котором идет речь?Или,
    • Вы ожидаете, что это откроет любое шифрование, выполненное на предприятии?
    • Я просто хочу быть уверен, что ваша формулировка не должна быть истолкована таким вторым способом
    • твоя фраза 'decrypt any data- звучит опасно
      (и неосуществимо / практично при шифровании с асимметричным ключом)

Обновление на основе комментария.

  • Вы планируете две копии данных каждый зашифрован разными ключами
    • один экземпляр должен быть зашифрован с помощью главная публика Клавиша
      • может быть расшифрован любым пользователем, имеющим мастер-рядовой Клавиша
        затем главный закрытый ключ должен быть защищен (открытый ключ не является критичным).
    • тот самый вторая копия должен быть зашифрован с помощью Rijndael 256 Клавиша
  • цель состоит в том, чтобы позволить ведущему устройству расшифровывать данные всякий раз, когда это необходимо
    особенно в отсутствие человека, который его зашифровал

Этот подход будет работать для, легкого доступа к данным для человека с ключом Rijndael,
без необходимости вмешательства владельца главного закрытого ключа.
И когда владельцу главного закрытого ключа доверяют секретность данных.

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


Однако, если пользовательские данные доверяются ведущему (как, очевидно, и в данном случае),

  • более простой подход было бы выдать ключ Rijndael от мастера
  • Мастер мог бы сохранить его зашифрованным с помощью самого главного открытого ключа
  • Затем данные могут быть зашифрованы только с помощью выданного ключа Rijndael
    • он всегда будет доступен с помощью мастер-закрытого ключа
      который может открыть ключ пользователя Rijndael

Если пользователю необходимо подписать данные, это может быть сделано отдельно в процессе.
Это избавит вас от необходимости создавать двойные копии и поддерживать их в рабочем состоянии.


Чтобы подписать данные, пользователь может иметь сгенерированную им пару ключей.

  • Перед шифрованием данных с помощью закрытого ключа Rijndael
  • тот самый мастер-открытый ключ зашифрованный с помощью пользователь-закрытый ключ может быть добавлен к нему
  • тот самый открытый ключ пользователя поделился с мастером (по крайней мере)
    будет достаточно для подтверждения того, что пользователь предоставил данные
  • В худшем случае, если пользователь недоступен и не удается подтвердить ключ,
    ведущему устройству можно доверять в отношении подлинности данных, которые все еще могут быть расшифрованы
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top