2011-05-08 60 views
4

我想創建一個多用戶應用程序,但我不知道如何保存和讀取加密密碼。如何爲多用戶應用程序本地存儲密碼?

procedure SavePass(Password: WideString); 
var 
    Pass: TIniFile; 
begin 
    Pass := TIniFile.Create(ChangeFileExt(Application.ExeName, '.PASS')); 
    Pass.WriteString('Users', 'USERNAME', Password); 
    Pass.Free; 

密碼必須存儲在計算機上。 這有效,但使用它保存密碼很愚蠢。 哈希密碼也會很好。

+0

爲什麼不在Windows中使用用戶和密碼的默認設施?如果你的域名對於多用戶程序來說是正常的,我會使用域名服務器和可用的功能來驗證用戶身份。如果你在一臺機器上,我會對該機器上的用戶表進行身份驗證。如果你不知道如何解決這個問題,可以問一個問題:'如何驗證域中的用戶(活動目錄)'。 – Johan 2011-05-08 10:13:29

+0

您有另一個問題:不要在應用程序目錄中存儲任何內容。它不是可寫的,而是具有高權限的用戶,並且每個計算機用戶都可以讀取它。 Vista和7會重定向壞應用程序,但最好編寫出性能良好的應用程序,並將數據存儲在更安全的地方。 – 2011-05-08 19:35:44

回答

9

如果連接軟件接受哈希密碼,它不會阻止那些竊取哈希密碼連接的人。它所要做的就是隱藏真正的密碼。此外,如果您連接的軟件不接受散列密碼(數據庫,網站,...),您將不得不以密碼的方式存儲密碼到原來的狀態。哈希版本不會幫助你。

如果你想打亂你的存儲空間,使人們無法讀取文件,你可以使用Windows.EncryptFile()Windows.DecryptFile()。在較新的Delphi中,它整齊地包裝到IoUtils.TFile.Encrypt()IoUtils.TFile.Decrypt中。

如果你真的想阻止他人閱讀你的密碼的明文版本,你將不得不使用一些密鑰加密。那麼你在哪裏存儲密鑰呢?這首先會破壞存儲密碼的全部目的。例如,通過使用用戶對文件系統的權限來阻止其他用戶訪問,因爲您或您的軟件可以執行的任何操作都是「黑客」可以執行的,只要他擁有相同的權限即可。

+3

Robrok,如果你不明白答案,那麼請不要接受它作爲*正確的*答案。當你這樣做的時候,那些有興趣回答問題的人就不再關注了,有興趣瞭解答案的人就會和你一樣困惑。如果您有更多問題,請詢問。 – 2011-05-08 09:31:58

+1

@Robrok,也考慮加入一些鹽,例如:HashedPassword:= Md5('SomeSalt'+ PlainPassword); – andrius 2011-05-08 10:26:26

2

你應該存儲散列密碼。例如,您可以使用Delphi Cryptography Package的SHA算法之一。當您檢查密碼時,會將用戶提供的密碼與存儲在文件中的密碼進行比較。

您是否考慮過使用Windows安全性,而不是試圖推出自己的?


順便說一句,你是容易遇到的,如果你的程序駐留在程序文件目錄下,UAC在使用寫入程序目錄的問題。

+0

不工作,因爲Delphi無法找到某些組件。 SHA很好,但請給其他互聯網資源。 – 2011-05-08 07:35:05

+0

它在delphi 7上工作我相信。有什麼問題? – 2011-05-08 08:08:59

+0

我不wana安裝第三方組件來運行這個演示。那就是問題所在。 – 2011-05-08 08:36:23

0

我認爲最好在HKEY_CURRENT_USER下的註冊表中保留用戶特定的設置。這將使他們的設置保持在一起並與其他用戶的設置分開。

當您從註冊表的這個區域讀取時,您將自動閱讀正確的用戶設置,並且您還應該在那裏存儲您的密碼。是的,按照David的建議進行加密。任何人都可以輕鬆使用RegEdit來閱讀註冊表。

這是an article on how you can write to and read from the registry

+0

易於破解! – 2011-05-08 08:04:05

+1

我期望一個包含密碼的文件需要在用戶之間共享,而不是每個用戶共享。正如它發生的情況,註冊表沒有可寫共享設置的好地方。不,我不是你的downvoter。 – 2011-05-08 08:04:19

+0

@robrok你的意思是什麼容易破解?哈希看到這一點。 – 2011-05-08 08:05:28

1

Lockbox有散列和加密程序。您應該將密碼與隨機「salt」串聯起來,並將salt和hash存儲在一起。爲了讓人們更難以強制哈希 - 嘗試所有可能的密碼直到找到正確的密碼 - 您應該迭代哈希。當用戶隨後輸入他們的密碼進行登錄時,從商店購買鹽並用他們輸入的密碼對其進行哈希處理,然後迭代並根據您存儲的哈希值來測試結果。如果他們是相同的,他們已經給出了正確的密碼。

+0

什麼大..我只需要兩個功能,但這個程序弄亂了我的電腦。 – 2011-05-08 08:34:14

+0

僅適用於Delphi2007及更高版本。 – 2011-05-08 08:37:00

+0

我的電腦很辛苦。我的德爾福,noooooooo! – 2011-05-08 08:45:53

2

我的建議是根本不在應用程序中使用密碼,除非您確實需要。用戶再次輸入密碼的用戶體驗通常不需要記住。

我爲我的應用程序默認使用當前用戶的域名和用戶名作爲標識。用戶已經使用密碼登錄,或者如果他們需要,可以使用更安全的系統。只有登錄才能成爲當前用戶。然後我的服務器接受它作爲它們的標識。

此變化還包括可選擇傳遞機器名稱,以便同一用戶在不同計算機上的處理方式不同(當他們需要一次使用多臺計算機時)。當然,如果你願意,你仍然可以允許一個正常的密碼。

+0

你是說你只是發送域名/用戶而沒有利用Windows身份驗證? – 2011-05-08 12:45:58

+0

嗯,是的,我只是說我只是發送域名/用戶,但是Windows會照顧身份驗證,因爲我從當前用戶處獲得域名/用戶。鑑於他們只能通過登錄才能獲得,它運作良好。並保存任何人不得不記住另一個密碼,或更糟的是,輸入密碼。 – mj2008 2011-05-08 13:34:28

+0

這不是一個安全的方式來進行身份驗證。枚舉域用戶非常簡單。你的服務器如何知道這是一個登錄用戶? Windows域提供了一個複雜的身份驗證機制,它依賴於Kerberos令牌。如果你能做到這一點的方式進行身份驗證。否則就是安全性較低的NTLM。 – 2011-05-08 18:35:53

1
  • 只要你能,不存儲密碼,但適當的哈希他們(使用鹽,重複哈希n次,等等),因爲彩虹表攻擊是可行的,對窮人選擇的密碼,太正常工作簡單的哈希。
  • 如果可能,請利用「集成安全性」。使用Windows authentication來避免存儲密碼。
  • 如果您確實需要存儲主密碼或類似密碼,請使用Windows API(如CryptProtectData)在本地保護它們。
+0

@羅布羅克:對不起,我不明白你的要求,請更具體一些。 – 2011-05-09 21:42:28

+0

請用Delphi語言! – 2011-05-11 13:31:18

相關問題