2012-01-08 39 views
2

我正在編寫一個用於以加密形式存儲文件的web應用程序,但稍後可以在非php環境中進行解密。因此,假設用戶上傳了一個名爲doc.pdf的文件。 然後它以加密形式加密並存儲在服務器上。然後用戶可以稍後下載加密的文件並在他/她的系統上對其進行解密。在PHP中執行外部程序的有效方法?

因爲使用php的mcrypt擴展加密的文件是不可移植的,所以我決定用c編寫一個名爲「encrypt」的程序。然後,我調用它在PHP:現在

$return_var=exec("encrypt $file_path $key"); 

,我認爲的另一種方法是創建一個加密的服務器基本上是與周圍聆聽通過套接字請求的能力的加密程序的包裝。所以我們可以說php腳本現在會向這個程序發出一個請求,提供一個文件名和要加密的密鑰。

我認爲這可能是一種更靈活的方法,因爲通過將加密服務器程序放在另一臺計算機上,可以輕鬆調整加密過程的負載。

現在,我的問題是兩種方法中的哪一種方法是有效的(就速度而言,處理大量客戶等)?

+1

如果您可以將傳入的數據流式傳輸到執行加密的某些內容,然後直接將其寫入磁盤,那麼它真的會得到回報。處理文件就好像它是一個批處理過程一樣,效率要低得多,因爲你必須將數據加載到內存中X次,甚至可能從磁盤加載(這也可能是不安全的)。 – 2012-01-08 13:57:36

回答

1

大部分加密過程將用於執行對稱加密,例如, AES。 AES - 和大多數密碼密碼 - 相對較快。您有很多機會等待I/O而不是加密部分。爲此創建一個服務器應用程序幾乎肯定是矯枉過正。如果真的需要,我會先選擇本地應用程序,然後再恢復到基本優化。

+0

我同意你的看法,但讓我的主服務器上說,Web服務器和數據庫服務器都在運行,然後在同一臺服務器上執行加密可能會增加負載。所以使用服務器應用程序會更好嗎?任何方式I/O都可以通過使用高速連接來在服務器端進行優化。我錯了嗎 ? btw thanx輸入 – tnx1991 2012-01-08 14:01:46

+0

我同意@owlstead。可能這將是用PHP編寫這個程序然後將你的應用程序集羣化的最佳解決方案。(即:遷移到雲) – Kaii 2012-01-08 14:10:32

+0

@Kail是的,集中PHP應用程序(如果需要,也是一樣)也是我的解決方案。爲什麼我要製作專用服務器的唯一原因是架構或安全目的(將密鑰安全和可訪問性降至最低),而不是出於性能原因。但是我會先開始工作(創建一些CLI工具),然後美化它並從那裏開始工作。 – 2012-01-08 14:36:22

0

如果你在PHP中執行加密而不執行導致非常大開銷的外部程序,它可能會更好。

窺視mcrypt擴展:

http://de2.php.net/manual/en/mcrypt.examples.php

和只寫結果字符串到目標文件。

+0

我最初想到了它,甚至實現了它。但是,當使用c程序解密文件時,它只是無法工作。我搜索了很多,發現使用php mcrypt的擴展加密是不可移植的。 – tnx1991 2012-01-08 14:05:45

+0

它是可移植的 - 最有可能在加密和解密時使用不兼容的密碼。當你正確地獲得所有的密碼參數時,你可以用其他語言加密數據。實際上,mcrypt只是C函數的一個包裝。 – Kaii 2012-01-08 14:08:34

+0

那麼,如果你這麼說,我會再次通過我的實施。 thanx – tnx1991 2012-01-08 14:17:20

0

我只想對文檔的原因只是ZIP /壓縮文件,用密碼,並保持該密碼保存以供用戶下載等

這樣,用戶就不需要對他們到底有什麼解密工具並且加密/ zip保護已經爲您完成。

我意識不到你在問什麼,但我會這樣做,爲了不重新發明輪子,仍然實現相同的結果,受保護的文件。

+0

其實我的要求有點複雜,我必須使用多種加密算法,這些加密算法可能因文件而異。此外,系統不應僅限於文件。 – tnx1991 2012-01-08 14:08:27