2010-06-14 84 views
3

我的web應用程序存儲外部網站登錄/密碼以便與他們進行交互。要與這些網站進行交互,我需要使用原始密碼文本,因此僅將哈希存儲在我的數據庫中不起作用。存儲原始密碼文本

我應該如何存儲這些密碼?

編輯: 我擔心是否有人訪問我的服務器。如果我使用某種雙向加密並且他們有服務器訪問權限,那麼他們可以檢查密碼在後端代碼中的解密方式。

回答

3

在我看來,你想以類似於Firefox和Chrome的方式存儲密碼。那麼爲什麼不看他們如何做呢?

這是Chrome瀏覽器如何做的: http://www.switchonthecode.com/tutorials/how-google-chrome-stores-passwords

+0

有趣的部分是在最後:「CryptProtectData,它是一個Windows API函數,用於加密數據。[...]它只能在同一臺機器上和同一用戶解密......」它不告訴我們加密是如何工作的,或者其他平臺有什麼替代方案,所以我不確定它是否直接適用。 – 2010-06-14 13:51:46

3

如果你必須這樣做,你應該使用雙向加密。這裏有很多算法(密碼),但基本上用加密密鑰加密數據,並使用相同的密鑰再次解密。

選擇合適的加密取決於由你選擇的編程語言的支持,但它的實例是:

  • 河豚
  • 3DES

他們有不同的複雜性和一些比其他人更難以破解。但是,您應該認識到,如果有足夠的時間,雙向加密不會受到破解的威脅。所以這一切都取決於這些密碼有多敏感。

/Carsten

+0

好的,但你在哪裏存儲加密密鑰?對我來說,就像你剛把問題搬到另一個地方一樣。 – 2010-06-14 04:44:44

+0

這就是我所擔心的 - 如果有人可以訪問我的服務器,那麼他們可以計算出原始密碼,不管它們是否加密。 – hoju 2010-06-14 05:55:55

+0

@Mike:同意。但根據理查德的設置,數據庫數據可能比文件系統更容易(從破解者的角度來看)訪問。所以我們所有的答案都取決於理查德想要消除什麼樣的威脅。 – 2010-06-14 06:07:49

3

確定您正在保護他們的是什麼。選項包括(但不限於):意外泄露,您的披露,傳輸中的披露,由於代碼錯誤引起的披露,由於硬件的物理盜竊而導致的披露等。

如果這是一個Web應用程序,用戶正在存儲他/她自己的一組密碼,那麼您可以使用他們的登錄密碼將這些密碼加密到您的應用程序中。如果這是每個用戶單獨安裝的應用程序,並且它保留自己的本地數據庫,那麼您可以擁有一個可選的主密碼(如Firefox)。

如果您只是在硬件被盜時確保數據安全,則可以使用像TrueCrypt或PGP WDE或Ubuntu,Debian或Fedora內置方法的全盤加密解決方案,並且需要PIN碼或每次啓動時輸入密碼。

如果您只關心安全傳輸,請確保您使用傳輸安全性的代碼,並且不必擔心加密數據庫中的數據。

+0

是的,它是一個Web應用程序,我擔心有人能夠訪問數據庫和後端代碼可讀的服務器 – hoju 2010-06-14 06:01:36

+0

因此,使用用戶的登錄密碼或其衍生作爲密鑰對數據庫中的密碼進行加密(對稱) (例如,secure_hash(constant_server_secret + user_password)) 只有當它們的會話處於活動狀態時,纔會將該密鑰保存在內存中,並在會話過期或註銷時將其丟棄。不要發送給用戶;他們不在乎,而且暴露了關鍵。 攻擊者(甚至你自己)可以訪問的唯一密碼是具有活動會話的用戶的密碼,然後只是仔細查看當前內存狀態。 – Slartibartfast 2010-06-15 03:26:44

3

我會去這個以下列方式。

對硬件保護數據被竊取:

使用光盤加密在以前的文章中討論。

保護數據,如果服務器被攻破(黑客攻擊):

我會用兩個不同的服務器爲這個項目,一名工人服務器和一個前服務器。

A)工人服務器

  • 這與密碼等, 還連接到其他服務時DB。
  • 要連接到工作服務器,用戶可以 通過API做到這一點。 API應該 對功能,insertUserData, 它允許用戶數據被插入, API躲過所有的輸入。
  • API使用 其中只有輸入的用戶數據表 privilegies一個DB用戶。
  • 這將是聯繫 此服務器的唯一途徑。
  • 只允許SSL 連接。
  • 該服務器反過來運行連接到外部服務的chron作業,從中提取數據並填充數據庫。使用具有不同用戶權限的不同數據庫。
  • 該服務器運行另一個連接到前端服務器的chron JOB,並將新數據推送到前端服務器。
  • 從您的IP運行
  • 只有SSH/SCP服務的最小量,嚴密的防火牆。如果連接斷開X /分鐘等,它們只會偶爾插入。
  • NO FTP等

B)前服務器

從工人服務器接收數據,從不使用密碼本身。只有聯繫工作服務器的方法是通過上面提到的API,僅用於新用戶信息。這是所有用戶登錄查看他們的信息的地方等。

在同一臺服務器上這樣做的問題,如果你被黑客入侵,黑客可以坐下來嗅探所有傳入的數據/密碼等等。所以即使他們存儲/加密/解密安全,有一定的耐心,他會聞所有。

+0

我知道如果一個黑客能夠訪問工作服務器,你就會被搞砸了,但這會讓它變得幾乎不可能。您還可以添加工作服務器上的API依次調用存儲過程。 – grandnasty 2010-06-14 13:21:09

1

當應用程序第一次運行時,它會生成一個隨機密鑰。該密鑰將用於加密和解密敏感數據。將密鑰存儲在本地文件中,並設置文件權限,以便其他人無法讀取它。確保運行Web服務器的用戶沒有登錄訪問權限(無論如何,這是個好主意)。

可能的方式來打破這個系統:

  1. 獲得root權限。
  2. 獲取sudo訪問權限。
  3. 在Web服務器上部署惡意應用程序 - 此應用程序將有權訪問該密鑰,並可能能夠將其發送到其他位置。

只要你對所有這些採取合理的預防措施,你應該沒問題。


編輯:試想想起來了,你可以只直接存儲在密鑰文件中的敏感數據。加密會提供額外的安全層,但它不會是一個非常強大的層;如果攻擊者可以訪問該文件,那麼他也有權訪問數據庫。