2014-01-24 29 views
-1

我知道這是一個話題,但我想具體詢問我的應用程序。還值得一提的是,我對PHP相當陌生,並且一直在學習。PHP CRUD應用程序,密碼擁有

所以我寫了一個看似基本的CRUD應用程序,使用PHP和MySQL。我所有的代碼都使用mysqli_ *,並且儘可能地使用最佳實踐。我所做的一件事是,大多數人都皺眉,用MD5來密碼。我認爲我理解使用SHA1的目的,因爲它應該比MD5需要更多的週期來散列/散開,鹽應該防止使用彩虹表。 bcrypt是一種較新的散列算法,需要比SHA1更多的CPU週期。至少我認爲這就是一切。

這是我的理解,你散列/鹽密碼,所以如果有人獲得訪問您的數據庫中的用戶表,他們沒有看到你的用戶密碼在純文本。對?
由於我的應用程序是一個基本的CRUD系統(針對小企業的庫存跟蹤,具有多個用戶和可定義的位置),如果有人要訪問我的用戶表並查看這些MD5哈希,他們可以很容易地將其反轉爲可讀密碼並登錄到我的系統中。但是,如果他們可以訪問我的數據庫並查看我的用戶表,那麼他們可以輕鬆地查看我的庫存表,產品表和數據庫中的所有其他表,無需登錄到應用程序即可獲取數據。目前,我的Web服務器有PHPMyAdmin和Webmin(帶有MySQL模塊),所以如果他們能夠訪問其中的任何一個,他們可以看到數據庫中的數據,而不用擔心登錄系統本身。

考慮到這一點,在這種情況下最好的做法是什麼?我的網絡服務器已經具有典型的安全性,比如阻止root SSH訪問,iptables等,但就密碼散列而言,我是否應該打擾升級我的代碼以使用bcrypt而不是MD5?是否升級到使用bcyrptMD5一個簡單的過程,或者我將不得不重新設計我的登錄系統是如何工作的?

謝謝!

回答

0

從PHP.net

$hashed_password = crypt('mypassword'); // let the salt be automatically generated 

    /* You should pass the entire results of crypt() as the salt for comparing a 
    password, to avoid problems when different hashing algorithms are used. (As 
    it says above, standard DES-based password hashing uses a 2-character salt, 
    but MD5-based hashing uses 12.) */ 
    if (crypt($user_input, $hashed_password) == $hashed_password) { 
     echo "Password verified!"; 
    } 

看起來不那麼難,對不對?記住,密碼不是那裏最大的漏洞,它需要更多的時間來保護網站免受所有這些XSS,CSRF和其他整潔的東西的影響。

換句話說,它並不是那麼大的脆弱性,但如果安全是您首要關心的問題,那就去做吧。

+0

這看起來並不困難,但是'crypt()'與'bcrypt()'相同嗎?相似之處?對於它的價值,我使用PHP-FPM 5.4.x. 另外,爲什麼downvote? – dhorn

+0

Downvote不是來自我,所以我不知道。實際上,PHP在5.5之前沒有bcrypt實現,其中引入了'password_hash()'。但是你可以使用帶'crypt'的'blowfish'編碼算法。提供的詳細信息@ PHP.NET – Eternal1

+0

像這樣使用的crypt函數將計算無信息的DES散列,並且對散列密碼非常不安全。 – martinstoeckli

0

您應該切換到BCrypt,因爲MD5的速度太快,因此可以很容易地被強制執行。你可以計算每秒大約8 Giga MD5哈希值,這意味着你只需要幾分之一毫秒來嘗試整個英文字典。

您可以做的最好的做法是使用新的PHP函數password_hash()來創建BCrypt哈希。

// Hash a new password for storing in the database. 
// The function automatically generates a cryptographically safe salt. 
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT); 

// 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); 

以前的PHP版本也存在compatibility pack

擁有對數據庫的讀取權限(SQL注入)並不意味着攻擊者可以完全控制服務器並可以操縱事物。