使用TCPDF和PHPass会导致生成PDF的麻烦



我有一个Codeigniter应用程序,它是我公司过去发给员工的旧电话目录的扩展。因此,对于那些想要打印输出的人,他们让我创建了一种"打印"方法,它比简单的HTML到纸更健壮。该应用程序让用户下载PDF。然而,他们也不希望PDF易于阅读,所以他们让我用用户的密码保护PDF。在糟糕的安全性(将原始密码存储在数据库中)的世界里,这一切都很好。。。

现在,尽管我已经实现了PHPass来散列所有密码,但这打破了PDF生成部分。当在Codeigniter中使用$this->pdf->SetProtection时,我唯一能传递的就是散列。这当然与用户在下载PDF后试图键入的内容不匹配。

在检查PDF中提供的内容之前,有人成功地修改了PDF处理密码的方式吗?到目前为止,我想出的唯一解决方案是要求他们在下载前再次输入密码,但我真的希望避免这一额外步骤。如果你需要更多的内容,请告诉我。谢谢!

你想做的是不可能的。哈希的目的是防止你正在做的事情。哈希是一种单向算法,这意味着一旦PHPass对密码进行了哈希处理,如果没有字典攻击或哈希表,就无法获得原始密码。

然而,有一些替代方案可以让您实现这一点,所有这些都具有不同的安全级别。

新密码

最安全的是,正如你所说,让用户在下载PDF时输入新密码,并将其传递给TCPDF。

缓存密码

另一种稍微不太安全的选择是在登录时将用户的纯文本密码缓存在Codeigniter或PHP会话中。然后,当您需要在PDF中添加密码时,可以使用会话中存储的密码。就我个人而言,我会使用PHP会话,而不是Codeigner,因为Codeigner将其会话用户数据存储在数据库会话表中的纯文本json数组中,而PHP则不这样做。

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

加密密码

您也可以加密数据库中的密码,而不是对其进行哈希处理。通过使用类似AES-256的东西对其进行加密,您可以再次解密密码,以便在PDF生成中使用它。然而,这确实带来了一些安全问题,因为如果攻击者获得了用于加密密码的AES密钥,则攻击者将能够像解密纯文本一样解密所有密码。它比纯文本密码更安全,因为攻击者需要获得数据库和源代码中的硬编码密钥,但这仍然是一个问题。

最新更新