Шифрование сообщений электронной почты с помощью GPG

Задача
Необходимо послать зашифрованное сообщение по электронной почте. Например, на вашем веб-сервере принимаются заказы, и надо отсылать письмо на фабрику с описанием заявки на обработку. Шифрование почтового сообщения предотвратит передачу по сети секретных данных в открытом виде, например таких, как номера кредитных карт.

Решение
Перед посылкой зашифруйте тело почтового сообщения с помощью программы GNU Privacy Guard (GPG):

$message_body = escapeshellarg($message_body);
$gpg_path = '/usr/local/bin/gpg';
$sender = 'web@example.com';
$recipient = 'ordertaker@example.com';
$home_dir = '/home/web';
$user_env = 'web';
$cmd = "echo $msg | HOME=$home_dir USER=$user_env $gpg_path " .
'--quiet --no-secmem-warning --encrypt --sign --armor ' .
"--recipient $recipient --local-user $sender";
$message_body = `$cmd`;
mail($recipient,'Web Site Order',$message_body);

Почтовое сообщение может быть расшифровано программой GPG, Pretty Good Privacy (PGP) или дополнительным расширением к почтовому клиенту, которое содержит одну из совместимых программ.

Обсуждение
PGP – это популярная программа шифрования с открытым ключом, а GPG – это программа с открытым кодом, основанная на PGP.


Поскольку программа PGP отягощена множеством патентов и проблемами контроля, зачастую легче использовать GPG.

Программа в разделе «Решение» вызывает /usr/local/bin/gpg для шифрования сообщения, находящегося в переменной $message_body. Она использует закрытый ключ, принадлежащий $sender, и открытый ключ, принадлежащий $recipient. Это означает, что только $recipient может расшифровать почтовое сообщение, и когда он это сделает, то узнает, что сообщение пришло от $sender.

Установка переменных окружения HOME и USER указывает GPG, где ей искать свои настройки для шифрования: $HOME/.gnupg/secring.gpg.

Параметры --quiet и --no-secmem-warning подавляют предупреждения GPG, которые в противном случае были бы сгенерированы и могли бы добавиться к тексту сообщения. Параметры --encrypt и --sign предписывают программе GPG зашифровать сообщение и подписать его.

Шифрование сообщения закрывает его от любого, кроме адресата. Подпись добавляет информацию о том, кто составил это сообщение и когда оно было составлено. Параметр --armor генерирует простой текст вместо двоичного кода, что делает зашифрованное сообщение более удобным для рассылки.

Обычно закрытые ключи защищаются с помощью идентификационной фразы.


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

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


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

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Не храните пароли на своем сайте
Обнаружение SSL-соединения
Проверка данных с помощью хеширования
Проверка надежности пароля
Работа с потерянными паролями

Вернуться в раздел: PHP / 14. Шифрование и безопасность