2

私は現在、閉ループの電子メール検証を必要とするプロジェクトに取り組んでいます。プロセスの一環として、ユーザーに送信されるリンクに追加できるランダムなハッシュ文字列を生成する必要があります。リンクをクリックすると、私のサイトに移動します。その時点で、アプリはハッシュを確認し、登録プロセスを完了します。私が使用しているすべてのハッシュについて:

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;
}
4

2 に答える 2

3

私はZFにあまり詳しくありませんが、その言葉が含まEncryptれているものは、間違ったアプローチのように聞こえます。

初期化ベクトルが対称暗号化で行うの->getVector()と同じように聞こえます。問題は、そのようなベクトルが暗号的に安全である必要はなく、ランダムである必要があるということです。たとえば、それは単にuniqid(mt_rand())何かとして実装されるかもしれません。

->getVector()mcryptIVの大きさを知るために、最初に暗号化暗号を初期化するために使用します。これは通常8バイトですが、使用する暗号のブロックサイズに大きく依存します。重要なのは、何も暗号化していないということです。ランダムなシーケンスが必要です。

ランダムシーケンスを取得するためのより良い方法はopenssl_random_pseudo_bytes()、8バイトのサイズで使用することです。

/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));
于 2012-12-06T23:24:08.477 に答える
0

ランダム生成機能のかなり包括的なスイートを備えたircmaxell のCryptLibを調べることをお勧めします。中程度の強度のランダム文字列ジェネレーターを使用する場合、次のようになります。

$generator = ( new CryptLib\Random\Factory() )->getMediumStrengthGenerator();
$string = $generator->generateString(LENGTH);

ライブラリは、複数の暗号的に安全なソースを使用し、それらをミキサーで実行して文字列を生成します。シンプルなソリューションが必要で、PHP を openssl で再コンパイルしたくない場合は、チェックする価値があります。

安全な文字列の生成に関するreadmeを参照してください。

于 2012-12-06T23:42:36.620 に答える