所以我有一個PHP代碼,它將密碼的散列版本保存到一個名爲passwords.txt的文件中。就目前而言,知道文件目錄(www.example.com/datacache/passwords.txt)的任何人都可以訪問它。這是不正確的做法嗎?我以爲我按照指南對信件進行了密碼處理,但這看起來奇怪地不安全。思考?建議?我可以以純文本形式存儲sha256哈希密碼嗎?
謝謝!
所以我有一個PHP代碼,它將密碼的散列版本保存到一個名爲passwords.txt的文件中。就目前而言,知道文件目錄(www.example.com/datacache/passwords.txt)的任何人都可以訪問它。這是不正確的做法嗎?我以爲我按照指南對信件進行了密碼處理,但這看起來奇怪地不安全。思考?建議?我可以以純文本形式存儲sha256哈希密碼嗎?
謝謝!
其實這裏還有兩個問題:
1)它是確定的哈希存儲在一個文件
保存密碼在文件中不是bett呃或更糟糕的是將其存儲在數據庫中。帶文件的一點是,它應該存儲在WWW根目錄之外。大多數提供程序都提供了一個私人目錄,可以通過代碼訪問,但無法訪問HTTP請求。
2)是否可以安全使用SHA-256散列爲密碼
無SHA *和MD5不應該直接用於散列密碼,因爲他們速度太快,因此可以蠻力強行太容易了。相反,應該使用像BCrypt,PBKDF2或SCrypt這樣的緩慢功能,它們提供了一個成本因素,並自動添加安全鹽。
PHP報價a password API有兩個功能password_hash()和password_verify()。使用它們,它們是未來的證明,並會產生BCrypt哈希。
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);
// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);
如果您運行的是沒有此API的舊版本PHP,請升級。如果由於某些原因您不能,請查看password_compat。
使用由我的主機提供的私人目錄(1and1)與僅在目錄中放置.htaccess文件來阻止用戶有區別嗎? – Schwaitz
@kuuy - 當然,你的意思是'.htaccess'文件中的'拒絕所有'命令。在實踐中,這也是一個很好的解決方案,理論上,超級目錄更安全一些。 htaccess方法依賴於正確的配置(你是否在開發團隊工作?),並假設服務器軟件不能被欺騙。 out-of-root目錄的另一個優點是,密碼文件不是版本控制的一部分,並且可以限制性地爲該目錄設置權限。 – martinstoeckli
所以我已經實現了password_has()和password_verify()命令(它花費了1and1設置來切換PHP版本),而且事情都很完美。我的確也意味着拒絕所有命令! – Schwaitz
理想情況下,你想將它們保存在一個安全的SQL數據庫,或者說描述的東西;哈希應該是第二道防線。
所以如果你的數據庫中的數據被破壞和黑客得到它的時候,就無法登錄到每個人的帳戶。
通常情況下,任何類型的散列的過程都是一旦它被帶出來,它將是最安全的過程,然後逐漸隨着時間的推移,隨着人員的集合和增加計算機的能力,散列會通常會通過一系列彩虹表「破碎」,最終會出現一個網站,例如THIS這就是Md5發生的情況。
如果您打算將它們存儲在一個.txt文件,你可以對你已經完成頂部做的最低,爲確保您的鹽哈希密碼。 對散列密碼進行醃製可減少被破解的機會。請參閱下面的鏈接,瞭解如何進行醃製。
Great video by Computerphile on YouTube about the topic
你能告訴我們你的代碼嗎? – Genzotto
[不要使用SHA256作爲密碼](https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016)。 –