setHash() public method

Sets the hash function.
public setHash ( string $hash )
$hash string
コード例 #1
0
ファイル: Base.php プロジェクト: paragonie-scott/phpseclib
 /**
  * Sets the password.
  *
  * Depending on what $method is set to, setPassword()'s (optional) parameters are as follows:
  *     {@link http://en.wikipedia.org/wiki/PBKDF2 pbkdf2} or pbkdf1:
  *         $hash, $salt, $count, $dkLen
  *
  *         Where $hash (default = sha1) currently supports the following hashes: see: Crypt/Hash.php
  *
  * @see Crypt/Hash.php
  * @param string $password
  * @param string $method
  * @throws \LengthException if pbkdf1 is being used and the derived key length exceeds the hash length
  * @return bool
  * @access public
  * @internal Could, but not must, extend by the child Crypt_* class
  */
 function setPassword($password, $method = 'pbkdf2')
 {
     $key = '';
     switch ($method) {
         default:
             // 'pbkdf2' or 'pbkdf1'
             $func_args = func_get_args();
             // Hash function
             $hash = isset($func_args[2]) ? $func_args[2] : 'sha1';
             // WPA and WPA2 use the SSID as the salt
             $salt = isset($func_args[3]) ? $func_args[3] : $this->password_default_salt;
             // RFC2898#section-4.2 uses 1,000 iterations by default
             // WPA and WPA2 use 4,096.
             $count = isset($func_args[4]) ? $func_args[4] : 1000;
             // Keylength
             if (isset($func_args[5])) {
                 $dkLen = $func_args[5];
             } else {
                 $key_length = $this->explicit_key_length !== false ? $this->explicit_key_length : $this->key_length;
                 $dkLen = $method == 'pbkdf1' ? 2 * $key_length : $key_length;
             }
             switch (true) {
                 case $method == 'pbkdf1':
                     $hashObj = new Hash();
                     $hashObj->setHash($hash);
                     if ($dkLen > $hashObj->getLength()) {
                         throw new \LengthException('Derived key length cannot be longer than the hash length');
                     }
                     $t = $password . $salt;
                     for ($i = 0; $i < $count; ++$i) {
                         $t = $hashObj->hash($t);
                     }
                     $key = substr($t, 0, $dkLen);
                     $this->setKey(substr($key, 0, $dkLen >> 1));
                     $this->setIV(substr($key, $dkLen >> 1));
                     return true;
                     // Determining if php[>=5.5.0]'s hash_pbkdf2() function avail- and useable
                 // Determining if php[>=5.5.0]'s hash_pbkdf2() function avail- and useable
                 case !function_exists('hash_pbkdf2'):
                 case !function_exists('hash_algos'):
                 case !in_array($hash, hash_algos()):
                     $i = 1;
                     while (strlen($key) < $dkLen) {
                         $hmac = new Hash();
                         $hmac->setHash($hash);
                         $hmac->setKey($password);
                         $f = $u = $hmac->hash($salt . pack('N', $i++));
                         for ($j = 2; $j <= $count; ++$j) {
                             $u = $hmac->hash($u);
                             $f ^= $u;
                         }
                         $key .= $f;
                     }
                     $key = substr($key, 0, $dkLen);
                     break;
                 default:
                     $key = hash_pbkdf2($hash, $password, $salt, $count, $dkLen, true);
             }
     }
     $this->setKey($key);
     return true;
 }
コード例 #2
0
ファイル: HashTest.php プロジェクト: bengitiger/phpseclib
 public function testSetHashValid()
 {
     $hash = new Hash('md5');
     $this->assertSame($hash->getHash(), 'md5');
     $hash->setHash('sha1');
     $this->assertSame($hash->getHash(), 'sha1');
 }