當用戶想要重置他的密碼時,我會向他的電子郵件發送一個6位數的密碼,然後檢查用戶是否輸入了匹配的密碼!使用rand生成確認碼安全嗎? php
我生成使用rand函數的代碼:
$code = rand (100000, 999999);
是安全的這樣做呢?
當用戶想要重置他的密碼時,我會向他的電子郵件發送一個6位數的密碼,然後檢查用戶是否輸入了匹配的密碼!使用rand生成確認碼安全嗎? php
我生成使用rand函數的代碼:
$code = rand (100000, 999999);
是安全的這樣做呢?
編號假設您想重置特權用戶的密碼。攻擊者所要做的就是針對他們控制的未經授權的帳戶(或多個帳戶)發出一堆重置,以預測下一個隨機值。這意味着他們可以爲特權用戶請求重置密碼(例如「管理員」),然後接管該帳戶。
的更多信息:
如果你真的想爲任何類型的安全保護功能的不可預測的隨機數字,隨意使用這個庫,我寫和維護:
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字節字符串應該足以阻止實際的和所有已知的理論攻擊。
雖然我同意,但爲什麼'rand'可預測的更多細節會很好。 – deceze 2015-02-25 02:32:39
http://security.stackexchange.com/a/18034也會編輯到上面的帖子中。 – 2015-02-25 02:33:11
取決於您對「安全」的定義。如果代碼僅在幾個小時內有效,則可能相當安全。一般來說'rand()'不被認爲是一個好選擇,所以如果可以的話,可以使用'mt_rand()'來代替。如果你使用'openssl_random_pseudo_bytes()'產生一個隨機的「代碼」,情況會更好。 – 2015-02-24 12:43:15
我想這是非常安全的,因爲黑客必須嘗試所有代碼來重置用戶密碼。你也可以首先發一封帶有確認鏈接的電子郵件,他想重置他的通行證,如果點擊了,那麼它會發送一個密碼,他必須使用 – Djip 2015-02-24 12:43:28
@TillHelge坦克你的迴應,但是mt_rand ()和rand(),以及如何使用openssl_random_pseudo_bytes() – david 2015-02-24 12:55:55