PHP-创建用于电子邮件闭环验证的随机哈希字符串

PHP-创建用于电子邮件闭环验证的随机哈希字符串,php,linux,encryption,random,Php,Linux,Encryption,Random,我目前正在做一个需要闭环电子邮件验证的项目。作为过程的一部分,我需要生成一个随机哈希字符串,该字符串可以附加到发送给用户的链接上。当他们点击链接时,他们将被定向到我的网站,此时应用程序将确认散列并完成注册过程。对于我所有的哈希,我一直在使用: hash('sha256', $string); 但是对于这个过程,我需要用一个随机值来种子$string。我有可用的Zend框架,并希望做类似的事情: $crypt = new Zend_Filter_Encrypt_Mcrypt(array());

我目前正在做一个需要闭环电子邮件验证的项目。作为过程的一部分,我需要生成一个随机哈希字符串,该字符串可以附加到发送给用户的链接上。当他们点击链接时,他们将被定向到我的网站,此时应用程序将确认散列并完成注册过程。对于我所有的哈希,我一直在使用:

hash('sha256', $string);
但是对于这个过程,我需要用一个随机值来种子
$string
。我有可用的Zend框架,并希望做类似的事情:

$crypt = new Zend_Filter_Encrypt_Mcrypt(array());

$hash = hash('sha256', $crypt->getVector());
我的问题是,这是生成随机散列码的可行算法吗

下面是Zend\u Filter\u Encrypt\u Mcrypt::setVector()方法(通过
getVector()
生成返回的值):

公共函数setVector($vector=null)
{
$cipher=$this->_openCipher();
$size=mcrypt\u enc\u get\u iv\u size($cipher);
if(空($vector)){
$this->_srand();

如果(strtoupper(substr(PHP_-OS,0,3))=='WIN'和&version_-compare(PHP_-version,'5.3.0',我对ZF不是很熟悉,但是其中包含
Encrypt
一词的东西听起来好像是错误的方法

->getVector()
听起来类似于对称加密中初始化向量的作用;问题是这样的向量不需要加密安全,只是随机的。例如,它很可能只是实现为
uniqid(mt_rand())
或其他什么

->getVector()
使用
mcrypt
首先初始化加密密码,以了解IV应该有多大;这通常是8字节,但在很大程度上取决于所用密码的块大小。问题是,你没有加密任何东西;你只需要一个随机序列


获取随机序列的更好方法是使用大小为8字节的
openssl\u random\u pseudo\u bytes()

如果没有它,您还可以从熵文件(如
/dev/random
/dev/uradom
)中读取。之后,您可以通过
binh2hex()
运行它来生成十六进制字符串

类似的内容非常初级,但应该适用于Linux系统:

$rnd = bin2hex(file_get_contents('/dev/urandom', false, null, 0, 8));
作为Windows的备用方案,您仍然可以使用以下内容:

$rnd = hash('sha256', uniqid(mt_rand(), true));

你可能想看看ircmaxell的,它有一套相当全面的随机生成功能。如果你使用中等强度的随机字符串生成器,如下所示:

$generator = ( new CryptLib\Random\Factory() )->getMediumStrengthGenerator();
$string = $generator->generateString(LENGTH);
该库将使用多个加密安全源,并通过混合器运行它们以生成字符串。如果您只是想要一个简单的解决方案,而不想用openssl重新编译PHP,那么值得一试


请参阅关于安全字符串生成的说明。

openssl_random_pseudo_bytes()@Jack:谢谢您的建议,有趣的阅读。您使用了多少字节?我将继续讨论这个问题,看看是否会有更多的响应。有点懒,不想重新编译php;)我用Zend如何生成向量的内容更新了帖子。它确实试图使用你提到的熵文件,这让我认为它是一个可行的api来生成随机字符串。@MikePurcell使用
mcrypt
仍然有些过分;你的安装没有
openssl
?没有,但我有完全控制服务器,这样我就可以重新编译。我是一个极简主义者,只添加所需的模块。@MikePurcell好吧,如果你的代码将在Linux服务器上运行,你应该有
/dev/[u]random
。你肯定是在Linux上,你的第一个例子看起来很有趣。我会做一些疲劳测试,然后回来报告。“当前版本被视为Alpha。这意味着它已经准备好开始测试和审查库,但功能不完整,生产不就绪。”:(@MikePurcell-Ah,我甚至没有意识到它仍然是alpha://在这种情况下,使用
/dev/uradom
可能是个不错的选择。Np,谢谢你的建议。总是对其他开发人员提供的可靠项目感兴趣。
$generator = ( new CryptLib\Random\Factory() )->getMediumStrengthGenerator();
$string = $generator->generateString(LENGTH);