2013-07-11 81 views
0

我有一個Codeigniter應用程序,它是我公司用來發送給員工的舊電話目錄的擴展。所以對於那些想要打印出來的人來說,他們讓我創建了一種「打印」的方法,比簡單的HTML更強大。該應用程序有用戶下載PDF。但是,他們也不希望PDF易於閱讀,所以他們讓我使用用戶密碼來保護PDF。這在所有可怕的安全性(將原始密碼存儲在數據庫中)中都工作得很好...使用TCPDF和PHPass導致生成PDF的麻煩。

現在儘管我已經實現了PHPass來哈希所有密碼,並且這會破壞PDF生成部分。在Codeigniter中使用$this->pdf->SetProtection時,我唯一可以傳入的就是哈希。這當然不符合PDF下載後用戶嘗試輸入的內容。

有沒有人在修改PDF處理密碼的方式方面取得任何成功,然後再檢查PDF中提供的內容?到目前爲止,我提出的唯一解決方案是讓他們在下載之前再次輸入密碼,但我真的很想避免這個額外的步驟。請讓我知道如果你需要更多繼續。謝謝!

回答

1

你試圖做的事情是不可能的。哈希的目的是爲了防止你在做什麼。哈希是一種單向算法,這意味着一旦密碼被PHPass哈希後,如果沒有字典攻擊或哈希表,就無法獲得原始密碼。

然而,有幾種方法可以讓你實現這一點,所有這些都有不同程度的安全性。

新密碼

最安全的就是像你說的讓用戶輸入新的密碼,當他們下載這是傳遞給TCPDF的PDF。

緩存密碼

另一種選擇是略少的安全是在登錄時笨或PHP會話緩存用戶的明文密碼。稍後您可以在需要向PDF添加密碼時使用存儲在會話中的密碼。就個人而言,我會使用PHP會話而不是Codeigniter,因爲Codeigniter會將其會話userdata存儲在數據庫會話表中的純文本json數組中,而PHP不會。

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

加密密碼

您也可以加密數據庫中的密碼哈希,而不是它的。通過使用諸如AES-256之類的東西進行加密,您可以再次解密密碼以在PDF生成中使用它。但這確實會引起一些安全問題,因爲如果攻擊者獲得用於加密密碼的AES密鑰,攻擊者就可以將所有密碼解密,就好像它們是純文本一樣。它比純文本密碼更安全,因爲攻擊者需要獲得源代碼中的數據庫和硬編碼密鑰,但這仍然是一個問題。

+0

謝謝惡狼。這就是我所擔心的。我想選項2是最好的。我會將它添加到我的待辦事項列表中。 – Vagari