我目前正在开展一个需要闭环电子邮件验证的项目。作为流程的一部分,我需要生成一个随机哈希字符串,该字符串可以附加到发送给用户的链接。当他们点击链接时,他们将被定向到我的网站,此时应用程序将确认哈希并完成注册过程。对于我一直在使用的所有哈希:
hash('sha256', $string);
但是对于这个过程,我需要使用随机值来$string
种子。我有Zend Framework可用,并希望做这样的事情:
$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;
}
答案 0 :(得分:3)
我对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));
答案 1 :(得分:0)