2011-08-31 58 views
12

我正在編寫一個C#應用程序,它將是開源的,我需要能夠爲每個用戶存儲保存的登錄信息。通常,我只是加密密碼,然後將其存儲在用戶設置文件中,但我擔心由於代碼是開源的,它會破壞加密的密碼。由於所有人都需要做的就是查看代碼並獲取加密密鑰。在開源應用程序中存儲保存的密碼

當然,它至少比以純文本存儲密碼困難得多。但是,是否有任何體面的密碼加密方式,但即使您有源代碼,仍然至少非常難以解密密碼?也許這樣做至少幾乎是 不可能在任何計算機上解密,而不是在它被加密的計算機上解密?

編輯:說明......我正在存儲客戶端的密碼,而不是密碼來驗證他們的服務登錄。它是我無法控制的預先存在的Web服務的客戶端。我只想在本地存儲密碼以進行自動登錄......就像任何聊天客戶端一樣。

編輯2:完全抱歉不清楚。但密碼必須以明文形式在某個時間點檢索,並且哈希不是一種選擇:(即使服務允許我傳遞密碼哈希值,但這樣可能會使目標失敗,因爲哈希值將與密碼一樣好:P

回答

1

我想如果您使用Rijndal並創建隨機鹽值並從機器特定事物(如某些硬件ID)中獲取密鑰,則即使您知道它是如何工作的,但由於缺少信息,它也很難解密硬件。

但你可以考慮只存儲密碼的散列和迭代至少1000倍。散列不能covnerted回原始密碼。

還有一個想法:它可能是一個選項,只是將實施留給誰來使用你的源代碼並使加密摘要?當然,如果你提供一個內置的軟件包下載,不會工作。但是再次說明:在構建中,您可以使用自己的「祕密」加密技術,並在源代碼中進行抽象化處理。

+0

不明白你對哈希的意思......我需要密碼的實際明文,因爲它必須從我的客戶端傳遞給服務(這是一個加密的連接),不能散列。 –

+0

根據您收到的密碼,再次計算哈希值並將其與您在數據庫中存儲的哈希值進行比較。如果它們匹配,則密碼匹配。當然,如果你需要密碼從你的服務器登錄到其他地方,這對你無能爲力。 – Krumelur

+3

他改變了這個問題的一部分,真正澄清,投票下來是一個不公平的。 – Lloyd

0

也許你可以使用一些特定於機器的值來加密密碼,比如mac或者sth ..如果有人獲得源代碼和加密密碼但是沒有完全訪問機器密碼應該是安全的。

+0

mac值不安全。考慮獲得計算機的mac值有多容易 –

+0

你說得對,我仍然處於非開源思維。無論如何,仍然是想獲得機器特定的價值。 – szamil

7

你問的基本上是不可能的。

沒有方式安全地存儲在客戶端機器上的密碼,如果它需要解密。事實上,你需要它來連接到一項我認爲不支持SSL的服務,這會使情況進一步惡化。在這種情況下,可以使用網絡分析儀輕鬆地找到密碼。

有一款遊戲(當然是封閉來源),我需要登錄才能玩,密碼保存在某個地方,但它的密鑰是每個安裝都獨有的密鑰加密的。我忘了一次密碼,所以我只使用Wireshark,瞧 - 我可以看到簡單的密碼。

這也讓我想起了人們抱怨易於在Google Chrome中泄露密碼......他們顯然不知道更好。你可以嘗試你想要的所有聰明的技巧,但是一旦有人訪問機器,任何應用程序安全性都會被拋出窗口。因此,考慮到這一點,我會保持加密和解密真的很簡單。充其量,您可以創建一個來自unique to the machine的密鑰,因此竊取加密密碼的用戶將無法在不訪問所述唯一密鑰的情況下對其進行解密。

+0

幸運的是,服務DOES提供SSL。是的,我知道唯一完全可靠的方法是讓用戶每次都輸入密碼,但我認爲大多數人都願意爲此放棄一點安全感。 –

+0

所以提供某種類型的令牌從服務器的某種有效性...它不是防火的,但它是一樣好,可以得到 –

+0

請你還可以提一些我可以用來加密密碼的算法嗎? –

0

Yuo可以使用babushka娃娃加密。用另一個密碼加密密碼,然後用另一個密碼加密,最後用明文寫上一個密碼。任何想要訪問密碼的人都會對所有未加密的密碼感到厭煩,並在他們獲得原始密碼之前放棄。

+0

不確定我會因爲沒有幽默感而失分。 – oenpelli

相關問題