Codeigniter 使用TCPDF和PHPass生成PDF会让人头疼。

Codeigniter 使用TCPDF和PHPass生成PDF会让人头疼。,codeigniter,tcpdf,phpass,Codeigniter,Tcpdf,Phpass,我有一个Codeigniter应用程序,它是我的公司用来发送给员工的旧电话目录的扩展。因此,对于那些想要打印输出的人,他们让我创建了一种“打印”方法,这种方法比简单的HTML到纸张的方法更加健壮。该应用程序让用户下载PDF。然而,他们也不希望PDF易于阅读,所以他们让我用用户密码保护PDF。在安全性很差的情况下(将原始密码存储在数据库中),这一切都很好 现在,虽然我已经实现了PHPass来散列所有密码,但这破坏了PDF生成部分。在Codeigniter中使用$this->pdf->SetProt

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

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


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

你想做的事是不可能的。散列的目的是准确地防止您正在做的事情。哈希是一种单向算法,这意味着一旦密码被PHPass哈希,如果没有字典攻击或哈希表,就无法获得原始密码

但是,有一些替代方案允许您实现这一点,所有这些都具有不同的安全级别

新密码

正如您所说,最安全的方法是让用户在下载传递给TCPDF的PDF时输入新密码

缓存密码

另一种稍不安全的替代方法是在登录时将用户的纯文本密码缓存在Codeigniter或PHP会话中。随后,当您需要向PDF添加密码时,可以使用会话中存储的密码。我个人会使用PHP会话,而不是Codeigniter,因为Codeigniter将其会话用户数据存储在数据库的sessions表中的纯文本json数组中,而PHP不会

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


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

谢谢Bad Wolf。这就是我担心的。我想方案2是最好的。我会把它添加到我的待办事项列表中。