2013-02-24 50 views
0

PHP crypt函數在本地和生產服務器上返回不同的哈希。 在本地主機上,crypt hash驗證工作正常,但在生產中沒有。本地/生產加密返回不同的哈希

Local: PHP 5.4.4 
Procution: PHP 5.3.10-1ubuntu3.5 

代碼:

echo crypt('123123123'); 

本地示例響應:

$1$7ymnm8q/$M6HLj2JEvzWGElqlwjAKm0 

製造例響應:

$6$sbttg2v6$2YAU3dNKR/.MRGmbBV4sR8vEhr/L8aOMTej1u3gArhgIiCiJ5IFJ 
+0

[Crypt在服務器上可能與本地機器不同](http://stackoverflow.com/questions/7058627/crypt-is-different-on-server-than-on-local-machine) – 2013-02-24 09:20:07

回答

1

PHP docu on crypt()舉例:

隱窩()將返回使用標準的基於DES-Unix的算法或算法的替代可能在系統上可用散列字符串。

所以cyrpt()沒有綁定到特定的算法,而是使用,系統支持什麼。

您可以使用以下常量來看看,這是在系統支持您正在運行crypt()

  • CRYPT_STD_DES
  • CRYPT_EXT_DES
  • CRYPT_MD5
  • CRYPT_BLOWFISH
  • CRYPT_SHA256
  • CRYPT_SHA512

如果您查看docu中的示例,您會看到,您的本地代碼使用MD5進行加密,而生產服務器使用SHA-512。

此外,您不指定特定的鹽,所以PHP會爲您生成一個,這在每次調用crypt()時也會有所不同。

+0

當我嘗試驗證密碼時,使用:(crypt($ form-> password,$ user-> password)!= $ user-> password)'在服務器上總是返回false。應該是什麼問題? – 2013-02-24 09:24:23

+0

@LucianoNascimento'crypt()'是一種單向函數。所以你不能以這種方式解密。要比較兩個密碼,你可以使用'crypt($ db_pw,$ salt)== crypt($ entered_pw,$ salt)''。 – Sirko 2013-02-24 09:29:49

0

的系統使用不同的默認哈希算法:$1$代表MD5,$6$的SHA-512

你應該明確地使用salt參數中指定的算法:

crypt('123123123', '$6$somerandomstring'); 

crypt() documentation

salt一個可選的salt字符串以hash繼續。如果未提供,則行爲由算法實現定義,並且可能導致意外的結果。