2010-04-08 55 views
2

我正在開發C++項目,該項目應該在Win32和Linux上運行,軟件將部署到小型計算機上,通常在遠程位置工作 - 每臺機器上都有可能會包含它自己的用戶/服務人員池尋找一種安全的,便攜式的密碼存儲方法

最近,我們的客戶要求我們通過密碼保護來引入訪問控制。

我們要滿足以下條件:

  • 支持遠程登錄
  • 支持遠程密碼更改
  • 支持遠程密碼重置意外/目的的缺失
  • EDITED
  • 支持數據檢索
  • 支持安全存儲

我能夠使用現有的庫來滿足「遠程」需求,但是我需要考慮的是一種存儲此數據的方法,最好採用在兩種平臺上都可以工作的方法,並且不會讓用戶看到它/讀取它,加密不是這裏的問題 - 這是存儲方法本身。

任何人都可以推薦一個安全的存儲方法,可以幫助我符合這些標準嗎?

編輯

我們最初考慮使用便攜式SQLite數據庫,但是我們感興趣的是,限制了對該文件的訪問與數據給用戶。我們如何實現這一目標? (文件,用戶不可見,文件不能由用戶手動等打開)

EDIT 2

乾杯流入到目前爲止的迴應,我們可以集中精力的方式來限制訪問文件本身?加密不是這裏的問題。我們正在尋找的是一種隱藏和備份文件的方式,只允許「MyApp.exe」使用它。

到目前爲止,我們還調查備用NTFS數據流,但我們不知道這是否會在Linux上

+0

安全存儲的方法是將它存儲在您的錢包或安全;) – klew 2010-04-08 13:18:43

+0

牆上安全甚至大聲笑 – Maciek 2010-04-08 13:23:19

+1

沒有安全的方式來使密碼存儲機制「支持遠程密碼檢索」。這要求以純文本形式存儲密碼,這是不安全的。 – jemfinch 2010-04-08 13:24:55

回答

2

您可以使用SQLite數據庫。由於它只是一個文件,您可以使用標準文件權限來限制訪問。例如chmod 600 foo.dbs將限制對該文件的訪問,以便只有擁有者才能讀取/寫入文件。

然後,正如其他人建議你在數據庫中存儲散列密碼,它會相當安全。

有傳言說,有一個商業版本的SQLite可用於加密整個數據庫文件。但是,這不應該代替存儲散列密碼,而只是散列的補充。

編輯:Here's指向商業版本的sqlite的鏈接,支持整個數據庫的加密。

+0

我們傾向於採取這種方式,但是我們需要限制對該文件的訪問權限 – Maciek 2010-04-08 13:43:46

+1

@Maciek,那是基於文件的權限。我的回答顯示瞭如何在Unix/Linux上執行此操作。對於Windows,你必須問問知道比我更好的人 – Glen 2010-04-08 14:11:39

2

工作不會存儲密碼本身。使用salt存儲密碼並將其存儲。

+1

這不是真的我的問題 – Maciek 2010-04-08 13:11:40

+0

我認爲這是你的問題的答案,但也許偏激。始終存儲散列密碼。當然,你無法閱讀,甚至電腦也無法閱讀(至少在相當短的時間內)。如果你的電腦可以讀取某些東西,那麼人類也可以。 – klew 2010-04-08 13:17:19

+0

+1因爲sbi是完全正確的,如果你真的關心密碼安全性(並不總是如此,有時如果方便超過風險存儲密碼本身就沒有問題),那麼你需要使用鹽味散列。 – Cruachan 2010-04-08 13:22:53

2

我不太清楚,如果我完全理解你的問題。但不管怎麼說。 如何設置用戶「FooUser」(假設您的產品是「Foo」)。將文件/數據庫存儲在只有用戶FooUser具有讀取/寫入權限的位置。通過模擬FooUser的服務/守護進程訪問文件/數據庫。

+0

這是一種方法,我想 – Maciek 2010-04-08 13:31:44

1

首先,neve存儲明文密碼,而不是存儲其散列。如果您希望用戶數量變得足夠大以致發生密碼衝突,那麼使用鹽也是一個好主意。

實際上您是否需要在所有系統上存儲密碼,或者您能否使用集中式密碼服務器解決方案?如果一個基於服務器的解決方案是可以接受的,那麼一個體面的challenge response方案可以在不泄露密碼或哈希的情況下對用戶進行身份驗證。使用證書與服務器進行安全通信,使僞造更難,然後只允許通過任何適當的方式訪問服務器上的密碼存儲,這可以是操作系統特定的,因爲只有一個,或者不讓人們進入服務器。

+0

我們正在處理分佈式系統。每臺機器都有自己的用戶池/服務人員 – Maciek 2010-04-08 13:33:51

6

對於登錄,您希望存儲密碼的迭代鹽醃散列而不是密碼本身。兩種可能性是:

  • bcrypt - 河豚的改良形式,使得增加了工作因子
  • PBKDF2 - 從使用HMAC具有散列函數,並隨機鹽的PKCS#5規範的函數來迭代一個密碼多次。

    • 支持遠程密碼取回

    我希望你能說服客戶是他們真正的意思是重置密碼:

然而,這並不符合你的要求工作,在這種情況下,你仍然可以使用密碼哈希。在意外/目的的缺失

這requirementment更難解決,並會要求您通過在數據庫中存儲加密的密碼,使他們能夠逆轉削弱安全

  • 支持數據檢索。爲此,您應該使用主密鑰,使用AES/CBC或AES/CTR模式等密碼隨機加密每個密碼。您應定期重新輸入主密鑰並重新加密所有密碼。然後,您需要一種機制來確定何時允許密碼檢索(例如母親的孃家姓等)

    要使用密碼來加密數據,請使用PKCS#5中的PKDF2功能從密碼生成密鑰。

+0

它被重置,而不是檢索。感謝您提出這個問題 – Maciek 2010-04-08 13:37:53

0

我認爲正確的方式去爲:

  • 在內存中,您連接的用戶名+密碼+一些餅乾(可以說:梅根·福克斯「)。

然後應用我使用.NET Framework的SHA(System.Security.Cryptography.SHA1CryptoServiceProvider),但我確信使它在C++中工作或者可能爲C++獲得它是沒有問題的。

因此,即使有人看到存儲的散列,他也無法知道密碼。事件如果他想比較相同的密碼,他會因爲用戶名+ cookie連接而得不到任何東西。 您的登錄代碼必須創建哈希並將其與存儲的哈希進行比較

問題是,您無法恢復密碼。但我認爲這是很好的。

希望這會有所幫助。

+0

這不是問題的答案:) – Maciek 2010-04-08 13:33:17

+0

好吧,我想你必須使用一些好的算法來加密密碼。問題是,密碼必須在代碼中的某處。我一直認爲主要威脅是員工可以訪問數據庫和硬件基礎架構,而不是外部攻擊者。 – 2010-04-09 11:49:38