linux-PHP-電子メールの閉ループ検証用のランダムハッシュ文字列を作成します
私は現在、閉ループの電子メール検証を必要とするプロジェクトに取り組んでいます。プロセスの一環として、ユーザーに送信されるリンクに追加できるランダムなハッシュ文字列を生成する必要があります。リンクをクリックすると、私のサイトに移動します。その時点で、アプリはハッシュを確認し、登録プロセスを完了します。私が使用しているすべてのハッシュについて:
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;
}
答え :
解決策:
私はZFにあまり詳しくありませんが、 Encrypt
という単語が含まれているものは間違ったアプローチのように聞こえます。< / p>
->getVector()
は、初期化ベクトルが対称暗号化で行うことと似ています。問題は、そのようなベクトルが暗号的に安全である必要はなく、ランダムである必要があるということです。たとえば、 uniqid(mt_rand())
などとして実装することもできます。
->getVector()
はmcrypt
を使用して、最初に暗号化暗号を初期化し、IVの大きさを認識します。これは通常8バイトですが、使用する暗号のブロックサイズに大きく依存します。重要なのは、何も暗号化していないということです。ランダムなシーケンスが必要です。
ランダムシーケンスを取得するためのより良い方法は、8バイトのサイズの openssl_random_pseudo_bytes()
を使用することです。
存在しない場合は、 /dev/random
や/dev/urandom
などのエントロピーファイルから読み取ることもできます。その後、 binh2hex()
を実行して、16進文字列を生成できます。
このようなものはかなり初歩的なものですが、Linuxのシステムで動作するはずです:
$ rnd = bin2hex(file_get_contents('/dev/urandom'、false、null、0、8));
Windowsのフォールバックとして、次のようなものを引き続き使用できます。
$rnd = hash('sha256', uniqid(mt_rand(), true));
答え :
解決策:
かなり包括的なランダム生成機能のスイートを備えたircmaxellのCryptLibを調べることをお勧めします。次のように、中強度のランダム文字列ジェネレータを使用する場合:
$generator = ( new CryptLib\Random\Factory() )->getMediumStrengthGenerator();
$string = $generator->generateString(LENGTH);
ライブラリは、暗号的に安全な複数のソースを使用し、それらをミキサーで実行して文字列を生成します。単純なソリューションが必要で、opensslを使用してPHPを再コンパイルしたくない場合は、チェックする価値があります。
安全な文字列の生成については、readmeを参照してください。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。