2017-09-28 59 views
0

我正在創建一個腳本,並希望將用戶密碼轉換爲使用password_hash函數的散列,但是我想使hashing動態確保password_hash函數實際上存在,所以我寫了以下函數根據可用的函數返回散列。PHP函數根據可用性使用password_hash,hash或MD5

function generateHash($hashpwd){ 
    if (function_exists('password_hash')) { 
     return password_hash($hashpwd, PASSWORD_DEFAULT); 
    } elseif (function_exists('hash')) { 
     return hash('sha512', $hashpwd); 
    } else { 
     return md5($hashpwd); 
    } 
} 

這個方法有什麼問題,或者它會起作用嗎?還我以下列方式使用password_hash創建哈希:

password_hash($hashpwd, PASSWORD_DEFAULT); 

但大多數地方我見過的例子語法格式如下:

password_hash($hashpwd, PASSWORD_DEFAULT)."\n"; 

區別是\ n爲\ n需要什麼?

+0

你嘗試了嗎? –

+1

就像警告一樣,當調用腳本的PHP可執行文件發生變化時,會發生什麼情況?就像在PHP中升級到5.5以後一樣,'password_hash'可用。如果以前使用sha512散列,散列會發生什麼? –

+1

* 「但大多數地方我已經看到了下面的格式示例語法: password_hash($ hashpwd,PASSWORD_DEFAULT)」 \ n 「;」 * - 你應該讀作[該用戶貢獻注](HTTP:// PHP .net/manual/en/function.password-hash.php#121017)。 –

回答

5

每一個缺乏password_hash(低於5.5)的PHP版本現在是end-of-lifed,因此不安全。它是a)不值得考慮這些現在非常危險的PHP版本,並且b)不值得將用戶降級到MD5作爲哈希算法,從而降低用戶的安全性。

但大多數地方我見過的例子語法格式如下:

password_hash($hashpwd, PASSWORD_DEFAULT)."\n"; 

我永遠不會看到這種情況。 \n是一個新的行。將它與散列一起保存到數據庫中會產生問題 - 如果您將散列輸出到某處以進行調試/查看,那麼這樣做只會值得。

+0

所以最好避免\ n? – Ahmed

+0

@Ahmed不僅僅是「最好的」,它包含'\ n'是絕對愚蠢的。 – ceejayoz

+0

謝謝,所以password_hash($ hashpwd,PASSWORD_DEFAULT);是正確的語法 – Ahmed

3

您寫道:

這有什麼錯用此方法或將它的工作?還我以下列方式使用password_hash創建哈希:

password_hash($hashpwd, PASSWORD_DEFAULT); 

但大多數地方我見過的例子語法格式如下:

password_hash($hashpwd, PASSWORD_DEFAULT)."\n"; 

差異\ n是\ n需要的,它是爲了什麼?

這兩者之間有區別,一個之一。

第二個將嵌入一個隱藏的換行符,這將使您的密碼驗證失敗默默。

根據this user contributed notepassword_hash()使用Jay Blanchard,在這裏堆棧溢出的成員。

使用將換行符\n連接到散列末尾的文檔中的示例時要小心,:

echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";

人與級聯換行符存儲的散列,因此password_verify()將失敗。


編輯:

9月29日,2017年

特別說明:

我重新審視今天password_hash()手冊,發現他們刪除的用戶貢獻note(由Jay Blanchard提供),其中的文件上被修改以除去\n參考,在那裏它現在讀取爲:

echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT); 

從它除去."\n"

現在,這對問問題和答案給定的軸承。

我相信這跟昨天提交的bug report有關,根據this comment在同一個問題中的另一個答案。

我也有需要注意的是此例中(本手冊的語法)可能有不利影響先前公佈答案,說明該URL不再有效。

就個人而言,我覺得他們應該留了便條在那裏和/或說明一些有關其先前使用。

5
  1. 單個無損SHA512是一個壞的回退password_hash。至少你需要在這裏使用不同的算法,包括鹽。最好使用crypt以及不錯的散列算法,這正是password_hash無論如何包裝。
  2. 有對PHP 5.3.7+,根據您的操作系統,甚至一些老版本一個password_hash backport。你不應該現實地需要支持比這更老的東西。你需要在沙地上畫線。大多數新項目至少需要5.6+。如果您需要支持舊的東西,使用受信任的圖書館像PHPass,這是直到PHP 3向後兼容
  3. password_hash($hashpwd, PASSWORD_DEFAULT)."\n";只是爲了調試輸出,其後的換行符是密碼哈希不一部分。
+0

我特別喜歡你的觀點#3關於*「僅用於調試輸出」*。 –