2012-05-09 65 views
1

在我目前的一個項目中,我使用的是單用戶認證系統。我說「單用戶」,因爲我沒有計劃在同一個Windows帳戶上爲多個用戶開展這項工作(僅僅因爲它不是我想要做的事)。字符串加密問題

當用戶啓動應用程序時,它們會顯示一個驗證屏幕。此認證屏幕使用圖像(即點擊圖像中的3個特定點),用戶名(標準編輯框)和圖像選項(允許用戶選擇要使用的圖像的下拉菜單)。圖像選擇,用戶名和點擊圖像上的點數必須與用戶在設置密碼時指定的值相匹配。

將所有3個結果合併爲一個字符串,然後使用Soap.EncdDecd.EncodeString方法對其進行編碼。然後使用SHA-512對其進行散列。最後,它使用DES加密。然後將此值與設置密碼時創建的值進行比較。如果匹配,他們被授予訪問權限。如果不是,訪問被拒絕。我打算在應用程序的其他位置使用SHA512值(例如在主應用程序中使用「主密碼」來授權自己使用各種不同的模塊)。

在一個示例中,初始字符串的長度爲29個字符,SOAP編碼的字符串約爲40個字符,SHA-512字符串爲128個字符,DES值爲344個字符。由於我沒有使用大量的字符串,它實際上非常快。 SOAP被用作非常基本的混淆而不是安全措施。

我擔心的是,第一部分(純字符串和SOAP)可能是弱點。基本的字符串不會給他們一些他們可以輸入並被授予訪問權限的東西,但是它會給他們「圖像點擊座標」以及用戶名和圖片選項,這可能允許他們訪問應用程序。 SOAP字符串可以很容易解碼。

什麼是加強驗證的第一部分以嘗試避免值直接從內存中扯下來的最佳方法?我是否應該關心潛在的利用者或攻擊者如何讀取這些值?

作爲與此相同主題直接相關的另一個問題;

什麼是最好的方式來存儲用戶在初始設置過程中創建的密碼散列?

我目前有TIniFile.SectionExists方法運行,因爲我已經沒有抽時間去想出一些更優雅。這是我缺乏知識的一個領域。我需要在會話中存儲密碼「hash」(所以使用內存流不是一種選擇),但是我需要確保安全性足夠好,以至於不能被任何腳本kiddie徹底破解。


它真的更關心我是否應該關心,以及我所做的編碼,哈希和加密是否足夠。我開發的圖片密碼系統已經是一個很好的基礎來阻止傳統的「我知道你的基於文本的密碼是什麼現在我在你的系統中」攻擊,但我關心的是更多的技術攻擊從記憶裏。

+0

你的用戶會恨你,你的程序仍然會被黑客入侵。兩個世界中最糟糕的。 –

回答

5

使用SHA-512,從哈希值中檢索初始內容是不可行的(至少在20年的計算能力和地球電能之前)是不可行的。

我甚至認爲使用DES並不是強制性的,並增加了複雜性。當然,你可以使用這樣慢的過程來使蠻力或基於字典的攻擊變得更難(因爲它會使每次嘗試都變得更慢)。更常見的不是使用DES,而是多次呼叫SHA-512(例如1000次)。在這種情況下,速度可以成爲你的敵人:快速的過程將更容易攻擊。

你可能要做的是在初始值上添加一個所謂的「鹽」。見this Wikipedia article

「鹽」可以固定在代碼中,或存儲在密碼中。

即:

Hash := SHA512(Salt+Coordinates+UserName+Password); 

最後建議:

  • 決不存儲在數據庫或文件中的純初始文本;
  • 強制使用強密碼(不是「hellodave」,由於字典很容易中斷);
  • 主要的安全弱點是椅子和鍵盤之間;
  • 如果你是偏執狂,在釋放之前顯式覆蓋(即每個字符一個字符)痛苦的初始文本內存(它可能仍然在RAM中的某處)。
  • 首先了解一些衆所周知的技術:您最好使用「challenge」和「nonce」以避免任何「replay」或「main in the middle」攻擊;
  • 如果您注意擁有強大的身份驗證方案(例如挑戰 - 響應)並保護服務器訪問權限,那麼將密碼哈希存儲在數據庫甚至INI文件中是安全的。

舉例來說,這裏是如何「乾淨」您的內存(但它可能會比這個複雜得多):

Content := Salt+Coordinates+UserName+Password; 
for i := 1 to length(Coordinates) do 
    Coordinates[i] := ' '; 
for i := 1 to length(UserName) do 
    UserName[i] := ' '; 
for i := 1 to length(Password) do 
    Password[i] := ' '; 
Hash := SHA512(Content); 
for i := 1 to length(Content) do 
    Content[i] := ' '; 
for i := 1 to 1000 do  
    Hash := SHA512(Hash); 

當安全交易,不要試圖推倒重來:這是一件困難的事情,你最好依靠數學證明(如SHA-512)和經驗豐富的技術(如鹽,挑戰......)。

有關驗證方案的一些示例,請參見how we implemented RESTful authentication for our Client-Server framework。這當然不是完美的,但它試圖實施一些最佳實踐。