2013-05-14 133 views
-2

在MVC風格的Web應用程序中,設置散列方法的最佳/最安全的方法是什麼?安全哈希方法

我剛剛被我的核心控制器是由我的腳手架其餘擴展之內這樣做:

class Core{ 

    protected function salt($string=null){ 
     $salt = 'dsjflk32osdjshewy8327rtewyrkjfdhdsgnmbcxvsgfyew3287'; 
     $this->data = md5($salt.$string); 

     return $this->data; 
    } 
} 

這是很好的做法,或者我應該做不同的東西?

+0

不要使用MD5,它太弱了。不要爲所有密碼使用普通食鹽。不要只使用密碼的單個散列。請閱讀https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet – Quentin 2013-05-14 06:35:22

+0

@Quentin - 謝謝,任何其他鏈接將不勝感激。 – Dan 2013-05-14 06:43:01

+0

嘗試crypt()http://www.w3schools.com/php/func_string_crypt.asp – ChamingaD 2013-05-14 06:55:05

回答

2

這取決於你想要什麼散列。如果它只是爲更大/分組數據集創建唯一標識符,那麼您可以使用MD5。當時使用鹽不是必需的,但它也不能傷害你。

如果你想使用它的密碼,不要使用哈希函數,該函數根據速度進行優化,因爲它不是真正安全的。對於密碼,我建議Bcrypt和this question有很多關於你爲什麼要使用它的信息。

如果你需要散列函數來破壞參數,所以它們不能被改變,一個md5散列就足夠了。由於您需要在某處存儲散列值和實際值之間的鏈接,因此他們可以嘗試暴力破解md5以更改參數,但它們仍然只能輸入您在鏈接表中允許的值。

+0

是的,絕對使用BCrypt的密碼,以及每個密碼的獨特salt。現在,不應該有必要自行創建鹽,因爲它是PHP函數[password_hash()](http://php.net/manual/en/function.password-hash.php)一件微妙的事情。 – martinstoeckli 2013-05-14 07:19:10

+0

如果你使用bcrypt,你不需要爲每個用戶添加一個獨特的salt。這是由bcrypt內部處理的。 – 2013-05-14 07:31:04

+0

使用BCrypt進行簡化的庫通常會生成這樣的鹽,但不是最終計算BCrypt哈希的'crypt()'函數本身。但這就是我剛剛寫的:-)。 – martinstoeckli 2013-05-14 07:37:53

1

看openwalls phpass

http://www.openwall.com/phpass/

它在很多開源的PHP項目

+0

我聽說過這個,看起來它基本上是一個擴展'md5()'的抽象層。很好找! – Dan 2013-05-14 06:32:13

+1

它不使用MD5,鹽是每個用戶,每個應用程序有1鹽有助於加速破解過程 – exussum 2013-05-14 06:46:51

0

這是一個替代的解決方案的使用,

 $this->data = crypt($salt.$string); 
0

在哈希中使用常量鹽不是一個好主意。每個散列使用不同的鹽是明智的。爲此,您可以:

  1. 隨機生成鹽和旁邊保存到哈希以dB爲單位

  2. (更好的)密碼總是與數據庫中的一些實體連接,所以你可以挑選贏得」一些屬性不要改變(它的ID或創建日期)作爲鹽的不同部分。

0

使用SHA512進行加密,MD5根本不安全。 方法我用它來加密:

$salt= hash("SHA512", $myconstantvar); 
$peper= hash("SHA512", $username); 
$pass= hash("SHA512", mypass); 

enc_pass= hash("SHA512", $salt.$pass.$peper);