2009-08-04 5 views
0

Я использую модуль PHP mcrypt для шифрования конфиденциальных данных в моей компании. Это хорошо работает. Однако мне было предложено создать новый мастер-пароль, который должен иметь возможность расшифровать любые данные. Проблема заключается в том, что этот главный пароль должен быть жестко закодирован в файле сценария. Пожалуйста, исправьте меня, если я ошибаюсь, но единственным безопасным способом, по-видимому, является жесткое кодирование открытого ключа в скрипте и использование его для шифрования данных, сохраняя секретный ключ в безопасности и использовать его для дешифрования только тогда, когда это необходимо.реализация криптографии с открытым ключом

У mcrypt, похоже, нет реализации для такой схемы. Кто-нибудь знает библиотеку (PHP-модуль или чистый PHP), который будет делать это?

ответ

2

Предлагаю взглянуть на привязки PHP OpenSSL и, в частности, функцию openssl_public_encrypt(). Вы действительно можете внедрить главный скрипт в скрипт и иметь скрипт для шифрования ключа AES каждого пользователя с помощью этого открытого ключа. Храните соответствующий мастер-ключ в компании в безопасности.

Если вам нужна функция главного дешифрования, вы должны вытащить зашифрованный пользовательский ключ, расшифровать его с помощью главного закрытого ключа и затем расшифровать исходные данные.

1

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

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

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

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

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

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


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

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

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


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

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

Хорошо, вот предлагаемая схема. Все данные, введенные пользователем, будут храниться дважды - один раз зашифрованы ключом пользователя (Rijndael 256) и один раз зашифрованы главным открытым ключом - жестко закодированным в скрипте. Пользователь будет получать/редактировать эти данные по своему усмотрению. Тем не менее, sysadmin также сможет извлечь эти данные в какой-то более поздний момент, используя главный закрытый ключ. –

+3

Для шифрования ключей пользователя с помощью открытого открытого ключа потребуется намного меньше процессора. – David

+1

Дэвид совершенно прав. Правильный способ решить эту проблему - использовать главный открытый ключ для шифрования эфемерных ключей, используемых для шифрования документов. Даже если используется асимметричный криптоскоп, обычно документы сначала шифруются с помощью симметричного ключа, а только симметричный ключ шифруется с помощью схемы асимметричного шифрования. Следовательно, независимо от того, используется ли симметричный или асимметричный криптограмм, обычно есть симметрийный ключ, который может быть зашифрован дважды: один раз для законного получателя и один раз для восстановления ключа. – Accipitridae

1

Я не вижу, как это будет работать. Любая функция двусторонней шифровки будет расшифровывать только при подаче определенного пароля, используемого для шифрования (если вы не NSA, и вы устанавливаете задние двери в алгоритмах). У вас не может быть двух паролей, дешифруемых одним и тем же файлом (если только нет хеш-коллизий, но это не то, что вы можете сделать легко).

Что касается хранения вашего основного пароля в программе, было бы гораздо лучше сохранить его в отдельном файле, в который программа считывает данные, поэтому вы можете использовать более жесткую защиту на уровне ОС в этом файле.

Имейте в виду, что mcrypt не является криптографией открытого ключа. Однако, используя криптографию с открытым ключом, вы, возможно, сможете делать то, что хотите. Например, с помощью PGP/GPG вы можете зашифровать файл таким образом, чтобы три разных пользователя могли расшифровать его с помощью своих секретных ключей, не зная личных ключей друг друга. Таким образом, вы можете иметь виртуального пользователя с основным паролем, который может расшифровать все.

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

+0

См. Мой комментарий к nik :) –

+0

Кроме того, можете ли вы предоставить ссылку на пример реализации/функциональности GPG, который позволит двум/трем различным пользователям расшифровать данные, не зная личных ключей друг друга? –

+0

http://lists.gnupg.org/pipermail/gnupg-users/2003-September/020170.html http://fixunix.com/pgp/71286-using-gnupg-decrypt-message-sent-multiple-recipients .html –

Смежные вопросы