2013-07-11 3 views
0

У меня есть приложение Codeigniter, которое является расширением старого телефонного справочника, который моя компания использовала для отправки сотрудникам. Поэтому для людей, которые хотят распечатать, у меня есть метод для «печати», который был немного более надежным, чем простой HTML-документ. Приложение загружает PDF-файл пользователю. Однако они также не хотели, чтобы PDF легко читался, поэтому у меня был пароль, защищающий PDF с помощью пароля пользователя. Все это прекрасно работало в мире ужасной безопасности (сохраняя необработанный пароль в базе данных) ...Использование TCPDF и PHPass, вызывающих головные боли при создании PDF-файлов.

Теперь, хотя я реализовал PHPass для хеширования всех паролей, и это разрушает часть генерации PDF. При использовании $this->pdf->SetProtection в Codeigniter единственное, что я могу передать, это хэш. Это, конечно, не соответствует тому, что пользователь пытается ввести после загрузки PDF-файла.

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

ответ

1

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

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

Новый пароль

Наиболее безопасен, как вы сказали, чтобы пользователь мог ввести новый пароль при загрузке в PDF, который передается в TCPDF.

Cache Пароля

Другой вариант, который немного менее безопасным является кэшировать простой текстовый пароль пользователя в сеансе CodeIgniter или PHP на входе в систему. Затем вы можете использовать пароль, сохраненный в сеансе позже, когда вам нужно добавить пароль в PDF. Лично я бы использовал сессию PHP, а не Codeigniter, потому что Codeigniter хранит свои пользовательские данные сеанса в массиве json с открытым текстом в таблице сеансов базы данных, а PHP - нет.

function loginHasCompleted() { $_SESSION['password'] = $_POST['password']; } 

зашифровать пароль

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

+0

Спасибо, Плохой Волк. Это то, о чем я беспокоился. Думаю, вариант 2 - лучший. Я добавлю его в список дел. – Vagari