2015-02-24 93 views
2

當用戶想要重置他的密碼時,我會向他的電子郵件發送一個6位數的密碼,然後檢查用戶是否輸入了匹配的密碼!使用rand生成確認碼安全嗎? php

我生成使用rand函數的代碼:

$code = rand (100000, 999999); 

是安全的這樣做呢?

+0

取決於您對「安全」的定義。如果代碼僅在幾個小時內有效,則可能相當安全。一般來說'rand()'不被認爲是一個好選擇,所以如果可以的話,可以使用'mt_rand()'來代替。如果你使用'openssl_random_pseudo_bytes()'產生一個隨機的「代碼」,情況會更好。 – 2015-02-24 12:43:15

+0

我想這是非常安全的,因爲黑客必須嘗試所有代碼來重置用戶密碼。你也可以首先發一封帶有確認鏈接的電子郵件,他想重置他的通行證,如果點擊了,那麼它會發送一個密碼,他必須使用 – Djip 2015-02-24 12:43:28

+1

@TillHelge坦克你的迴應,但是mt_rand ()和rand(),以及如何使用openssl_random_pseudo_bytes() – david 2015-02-24 12:55:55

回答

2

編號假設您想重置特權用戶的密碼。攻擊者所要做的就是針對他們控制的未經授權的帳戶(或多個帳戶)發出一堆重置,以預測下一個隨機值。這意味着他們可以爲特權用戶請求重置密碼(例如「管理員」),然後接管該帳戶。

的更多信息:

如果你真的想爲任何類型的安全保護功能的不可預測的隨機數字,隨意使用這個庫,我寫和維護:

https://github.com/resonantcore/lib/blob/master/src/Secure.php

$iRandom = \Resonantcore\Lib\Secure::random(100000, 999999); 

注意,這是很快將要採取/重構到這個倉庫在不久的將來(並提供甚至可能使其進入PHP 7的核心功能):https://github.com/SammyK/php-src-csprng

$iRandom = random_int(100000, 999999); 

它的不存在然而,儘管如此。我的代碼今天起作用。

如果你不信任我,您還可以檢查出安東尼費拉拉的精彩RandomLib項目:https://github.com/ircmaxell/RandomLib

$factory = new RandomLib\Factory; 
$generator = $factory->getGenerator(new SecurityLib\Strength(SecurityLib\Strength::MEDIUM)); 

$iRandom = $generator->generateInt(100000, 999999); 

不要使用rand()mt_rand()任何身份驗證(或繞過認證)的目的。永遠。

此外,您可能想要使用比6位數字更大的蠻力空間。一個十六進制編碼的32字節字符串應該足以阻止實際的和所有已知的理論攻擊。

+0

雖然我同意,但爲什麼'rand'可預測的更多細節會很好。 – deceze 2015-02-25 02:32:39

+0

http://security.stackexchange.com/a/18034也會編輯到上面的帖子中。 – 2015-02-25 02:33:11