我有一个Codeigniter应用程序,它是我公司用来发送给员工的旧手机目录的扩展。因此对于那些想要打印出来的人来说,他们让我创建了一种“打印”的方法,这种方法比简单的HTML更加健壮。该应用程序让用户下载PDF。但是,他们也不希望PDF易于阅读,所以他们让我用密码保护PDF用户的密码。这一切都在可怕的安全性(将原始密码存储在数据库中)中运行良好......
现在我已经实现了PHPass来散列所有密码,这打破了PDF生成部分。在Codeigniter中使用$this->pdf->SetProtection
时,我唯一可以传入的是哈希。这当然与用户在下载PDF后尝试输入的内容不匹配。
在检查PDF中提供的内容之前,有没有人在修改PDF处理密码方面取得了哪些成功?到目前为止,我提出的唯一解决方案是让他们在下载之前再次输入密码,但我真的想避免这一额外的步骤。如果您还需要更多信息,请与我们联系。谢谢!
答案 0 :(得分:1)
你要做的事是不可能的。散列的目的是准确地防止你在做什么。散列是一种单向算法,这意味着一旦密码被PHPass散列,您就无法在没有字典攻击或散列表的情况下获取原始密码。
然而,有一些替代方案可以让您实现这一点,所有这些都具有不同的安全级别。
新密码
最安全的就是你说用户在下载传递给TCPDF的PDF时输入新密码。
缓存密码
另一种安全性稍差的替代方法是在登录时将用户的纯文本密码缓存在Codeigniter或PHP会话中。然后,当您需要为PDF添加密码时,可以使用会话中存储的密码。我个人会使用PHP会话而不是Codeigniter,因为Codeigniter将其会话userdata存储在数据库的sessions表中的纯文本json数组中,而PHP则没有。
function loginHasCompleted() { $_SESSION['password'] = $_POST['password']; }
加密密码
您还可以加密数据库中的密码,而不是对其进行哈希处理。通过使用AES-256等加密方法,您可以再次解密密码以在PDF生成中使用它。这确实带来了一些安全问题,因为如果攻击者获得用于加密密码的AES密钥,则攻击者将能够解密所有密码,就好像它们是纯文本一样。它比普通文本密码更安全,因为攻击者需要在源代码中同时获取数据库和硬编码密钥,但它仍然是一个问题。