假設有一個保存純文本密碼的字符串變量。有人可以從Java應用程序竊取密碼嗎?
是否有任何使用內存轉儲讀取此密碼的可能性。 (假設使用作弊引擎。)我對這個JVM的東西感到困惑。 JVM是否爲此提供了某種保護。如果沒有什麼是我需要用來避免這種「偷竊」的做法。
實際的威脅是木馬;將內存轉儲的段發送給外部方。
假設有一個保存純文本密碼的字符串變量。有人可以從Java應用程序竊取密碼嗎?
是否有任何使用內存轉儲讀取此密碼的可能性。 (假設使用作弊引擎。)我對這個JVM的東西感到困惑。 JVM是否爲此提供了某種保護。如果沒有什麼是我需要用來避免這種「偷竊」的做法。
實際的威脅是木馬;將內存轉儲的段發送給外部方。
如前所述,是的,任何人都可以解壓密碼,以各種方式。加密密碼並不會真正起到幫助作用 - 如果它被應用程序解密,那麼解密後的表單也會出現在某個位置,再加上解密密鑰(或代碼)本身就成爲一個漏洞。如果它以加密形式發送到其他地方,那麼只知道加密表單足以欺騙交易,所以這也沒有多大幫助。
基本上,只要「攻擊者」也是「發件人」,你最終會被破解 - 這就是爲什麼音樂和視頻行業無法讓DRM工作。
我建議你拿起一份Applied Cryptography並閱讀第一部分「密碼協議」。即使沒有深入研究真正的密碼學數學,這也會讓你對這個領域的各種設計模式有一個很好的概述。
如果您在應用程序中以純文本形式保存密碼,則無論您使用的語言或運行時如何,都可以通過播放內存轉儲來讀取密碼。
要減少發生這種情況的可能性只有在您確實需要時纔將密碼保存爲純文本,然後轉儲或加密它。這裏需要注意的一點是,JPasswordField返回一個char []而不是一個字符串。這是因爲你無法控制字符串何時消失。雖然您無法控制char []何時消失,但在完成密碼後可以使用垃圾填充它。
我說減少,因爲這不會阻止某人。只要密碼在內存中就可以恢復,並且由於解密也是可交付成果的一部分,所以密碼也可能被破解,從而使密碼全部打開。
是的,for(char nextChar:pw)nextChar = 0; // 哪一個可能不行,請注意:final char []不是最終的 – 2009-10-02 08:52:19
您必須使用normal循環而不是foreach。是的,值得說明的是最終適用於數組的引用而不是值。 – 2009-10-02 09:01:22
如果程序知道密碼,任何使用該程序的人都可以提取密碼。
任何人都有足夠的技術熟練...... – 2009-10-02 09:51:52
從理論上講,你可以只把它掛到調試器...設置斷點......和閱讀字符串內容
此無關的Java - 完全相同的問題(如果它真的是一個)也不存在任何語言編寫的應用程序:
後者通常不被認爲是一個問題,因爲現代操作系統不允許任意應用程序觀察對方的內存,並且攻擊通常依賴於不同的攻擊向量。
如果你不知道它並且開發你的系統就好像「加密的」鍵確實是安全的那樣,這是一個問題。 – 2009-10-02 10:50:26
我只想指出,迄今爲止所有的答案同樣適用於幾乎所有的語言,而不僅僅是Java。問題完全一樣。有些語言可能會比其他語言更容易或更難,但它們都具有相同的基本「漏洞」。 – 2009-10-02 10:46:30
如果這個「某人」無緣無故地訪問了JVM,那麼與堆檢查攻擊相比,您會更加擔心這些事情。大多數人會說'遊戲結束'。類似的SO問題在http://stackoverflow.com/questions/646224/how-does-one-store-password-hashes-securely-in-memory-when-creating-accounts – 2009-10-02 10:55:48
將密碼存儲在服務器中,並檢查它何時需要 – 2012-03-28 13:24:58