Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 随机字符串是一个好的验证码吗_Php_Security_Registration_Account - Fatal编程技术网

Php 随机字符串是一个好的验证码吗

Php 随机字符串是一个好的验证码吗,php,security,registration,account,Php,Security,Registration,Account,我正在生成一个用于帐户激活的验证码。你以前可能见过这种事 我的问题:如果我要用这样一个复杂的公式生成这段代码: md5(md5(time().'helloguys'.rand(0,9999))); 它真的比只生成一个由32个字符和数字组成的随机字符串好吗,比如gj3dI3OGwo5Enf…?不,使用哈希也不好。选择32个随机字符会更安全(不太可预测)。(数字是字符。)使用一个好的(“加密”)随机数生成器,带有一个好的种子(来自/dev/random的一些字节)。不要把时间当作种子。同意埃里克森

我正在生成一个用于帐户激活的验证码。你以前可能见过这种事

我的问题:如果我要用这样一个复杂的公式生成这段代码:

md5(md5(time().'helloguys'.rand(0,9999)));

它真的比只生成一个由32个字符和数字组成的随机字符串好吗,比如gj3dI3OGwo5Enf…?

不,使用哈希也不好。选择32个随机字符会更安全(不太可预测)。(数字是字符。)使用一个好的(“加密”)随机数生成器,带有一个好的种子(来自/dev/random的一些字节)。不要把时间当作种子。

同意埃里克森的观点,只是可能会建议你使用时间

pwgen -1 -s
命令on*nix,这将比您可能发明的任何程序更好

如果您想以编程方式生成一些字符串,可以查看

<?php    
$better_token = md5(uniqid(rand(),1));
?>

这在碰撞之前提供了非常好的随机性


如果你需要更高级别的安全性,你可以考虑在

上生成随机序列。我计划用for循环生成32个随机字符。这种方法有什么问题?对于一个普通的网站来说,进行帐户验证不是很好吗。(我的意思是,即使我是推特或其他什么东西,就目前的目的而言,这不是很好吗)是的,我认为在
for
循环中一次选择一个字母是很好的,只要RNG是好的,就无所谓了。这对任何网站都有好处(可能需要更多的字符)。此外,避免使用看起来相似的字符。不要包含0、O、1、l或I,因为试图键入代码的人会出错。@Andrew:任何人都不应该键入此代码。。。他们要么点击链接,要么不能点击,他们应该复制粘贴。如果他们不明白的话。。我很惊讶他们会把它们放进他们的电子邮件帐户。你可能想考虑Base32对你的结果进行编码,这样你的用户就更容易区分一些字体中看起来相似的字符。除了产生随机值(即验证号)之外,如果两个用户注册并意外生成完全相同的验证码,您可能需要处理这种情况。如果唯一性很重要,我认为即使是mt_rand()也可能不够。我认为验证码会存储在数据库中-在列上放置一个唯一的键,在插入验证码之前,检查它是否已经存在于数据库中,并不断生成新的键,直到找到以前没有使用过的键为止。