예제 #1
0
function _hash_gensalt_private($input, &$itoa64, $iteration_count_log2 = 6)
{
    if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31) {
        $iteration_count_log2 = 8;
    }
    $output = '$H$';
    $output .= $itoa64[min($iteration_count_log2 + (PHP_VERSION >= 5 ? 5 : 3), 30)];
    $output .= _hash_encode64($input, 6, $itoa64);
    return $output;
}
예제 #2
0
function _hash_crypt_private($password, $setting, &$itoa64)
{
    $output = '*';
    // Check for correct hash
    if (substr($setting, 0, 3) != '$H$' && substr($setting, 0, 3) != '$P$') {
        return $output;
    }
    $count_log2 = strpos($itoa64, $setting[3]);
    if ($count_log2 < 7 || $count_log2 > 30) {
        return $output;
    }
    $count = 1 << $count_log2;
    $salt = substr($setting, 4, 8);
    if (strlen($salt) != 8) {
        return $output;
    }
    /**
     * We're kind of forced to use MD5 here since it's the only
     * cryptographic primitive available in all versions of PHP
     * currently in use.  To implement our own low-level crypto
     * in PHP would result in much worse performance and
     * consequently in lower iteration counts and hashes that are
     * quicker to crack (by non-PHP code).
     */
    if (PHP_VERSION >= 5) {
        $hash = md5($salt . $password, true);
        do {
            $hash = md5($hash . $password, true);
        } while (--$count);
    } else {
        $hash = pack('H*', md5($salt . $password));
        do {
            $hash = pack('H*', md5($hash . $password));
        } while (--$count);
    }
    $output = substr($setting, 0, 12);
    $output .= _hash_encode64($hash, 16, $itoa64);
    return $output;
}
예제 #3
0
function vanilla_crypt_private($password, $setting)
{
    $itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    $output = '*0';
    if (substr($setting, 0, 2) == $output) {
        $output = '*1';
    }
    if (substr($setting, 0, 3) != '$P$') {
        return $output;
    }
    $count_log2 = strpos($itoa64, $setting[3]);
    if ($count_log2 < 7 || $count_log2 > 30) {
        return $output;
    }
    $count = 1 << $count_log2;
    $salt = substr($setting, 4, 8);
    if (strlen($salt) != 8) {
        return $output;
    }
    # We're kind of forced to use MD5 here since it's the only
    # cryptographic primitive available in all versions of PHP
    # currently in use.  To implement our own low-level crypto
    # in PHP would result in much worse performance and
    # consequently in lower iteration counts and hashes that are
    # quicker to crack (by non-PHP code).
    if (PHP_VERSION >= '5') {
        $hash = md5($salt . $password, TRUE);
        do {
            $hash = md5($hash . $password, TRUE);
        } while (--$count);
    } else {
        $hash = pack('H*', md5($salt . $password));
        do {
            $hash = pack('H*', md5($hash . $password));
        } while (--$count);
    }
    $output = substr($setting, 0, 12);
    $output .= _hash_encode64($hash, 16, $itoa64);
    return $output;
}
예제 #4
0
function _hash_crypt_private($password, $setting, &$itoa64)
{
    $output = '*';
    if (substr($setting, 0, 3) != '$H$') {
        return $output;
    }
    $count_log2 = strpos($itoa64, $setting[3]);
    if ($count_log2 < 7 || $count_log2 > 30) {
        return $output;
    }
    $count = 1 << $count_log2;
    $salt = substr($setting, 4, 8);
    if (strlen($salt) != 8) {
        return $output;
    }
    if (PHP_VERSION >= 5) {
        $hash = md5($salt . $password, true);
        do {
            $hash = md5($hash . $password, true);
        } while (--$count);
    } else {
        $hash = pack('H*', md5($salt . $password));
        do {
            $hash = pack('H*', md5($hash . $password));
        } while (--$count);
    }
    $output = substr($setting, 0, 12);
    $output .= _hash_encode64($hash, 16, $itoa64);
    return $output;
}