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



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

hash('sha256', $string);

但对于这个过程,我需要用一个随机值对$string进行种子处理。我有Zend框架可用,并希望做这样的事情:

$crypt = new Zend_Filter_Encrypt_Mcrypt(array());
$hash = hash('sha256', $crypt->getVector());

我的问题是,这是一种生成随机哈希码的可行算法吗?

这里是Zend_Filter_Encrypt_Mcrypt::setVector()方法(生成通过getVector():返回的值

public function setVector($vector = null)
{
$cipher = $this->_openCipher();
$size   = mcrypt_enc_get_iv_size($cipher);
if (empty($vector)) {
$this->_srand();
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' && version_compare(PHP_VERSION, '5.3.0', '<')) {
$method = MCRYPT_RAND;
} else {
if (file_exists('/dev/urandom') || (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')) {
$method = MCRYPT_DEV_URANDOM;
} elseif (file_exists('/dev/random')) {
$method = MCRYPT_DEV_RANDOM;
} else {
$method = MCRYPT_RAND;
}
}
$vector = mcrypt_create_iv($size, $method);
} else if (strlen($vector) != $size) {
require_once 'Zend/Filter/Exception.php';
throw new Zend_Filter_Exception('The given vector has a wrong size for the set algorithm');
}
$this->_encryption['vector'] = $vector;
$this->_closeCipher($cipher);
return $this;
}

我对ZF不是很熟悉,但其中包含单词Encrypt的东西听起来是错误的方法。

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

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

获得随机序列的更好方法是使用大小为8字节的openssl_random_pseudo_bytes()

在没有它的情况下,您还可以从诸如/dev/random/dev/urandom之类的熵文件中进行读取。之后,您可以通过binh2hex()运行它来生成一个十六进制字符串。

像这样的东西是相当初级的,但应该在Linux系统上工作:

$rnd = bin2hex(file_get_contents('/dev/urandom', false, null, 0, 8));

作为Windows的后备方案,您仍然可以使用以下内容:

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

您可能想了解ircmaxell的CryptLib,它具有一套相当全面的随机生成功能。如果你使用中等强度的随机字符串生成器,比如:

$generator = ( new CryptLibRandomFactory() )->getMediumStrengthGenerator();
$string = $generator->generateString(LENGTH);

该库将使用多个加密安全源,并通过混合器运行它们以生成字符串。如果你只想要一个简单的解决方案,而不想用openssl重新编译PHP,那么值得一试。

请参阅有关安全字符串生成的自述文件。

最新更新