PHP HTML Безопасное хэширование паролей

Rice.

https://t.me/riceoff
Автор темы
Модератор
1,673
1,360
Изучаю html+php. Хотелось создать сайт с системой авторизации для некоторого круга людей.
Читал на других форумах, что система md5 и sha1 устарели и на их место пришло готовое api password_verify(), которое лучше хэширует данные. Все бы ничего, но темы, на которых я искал
информацию были созданы от 5+ лет.

Хотелось бы узнать актуальность этой информации у знающих людей с этого форума. Маловероятно, что мой сайт будут взламывать опытные хакеры, но обезопасить информацию на сайте хотелось бы.

Ещё один вопрос: какую лучше информацию заносить в сессию?
Логин + хэшированный пароль, либо другую информацию?
 
Решение
Вот как пример как работает создание учётки в моде для World of Warcraft
PHP:
<?php

declare(strict_types=1);

namespace app\security;

use Yii;
use yii\base\Exception;

class Security
{
    /**
     * @param int $length
     * @return string
     * @throws Exception
     */
    public function generateRandomString(int $length = 32): string
    {
        return Yii::$app->security->generateRandomString($length);
    }

    /**
     * @param int $length
     * @return string
     * @throws Exception
     */
    public function generateEmailVerificationToken(int $length = 32): string
    {
        return Yii::$app->security->generateRandomString() . '_' . time();
    }

    /**
     * @param string $password
     * @return string
     *...

Rice.

https://t.me/riceoff
Автор темы
Модератор
1,673
1,360
временный кук пользователя при входе и пароль думаю
Временный кук, который будет храниться в mysql и проверяться с куки пользователя на сайте?
А потом удаляться при выходе с сайта?
 

im0rg

Известный
Друг
587
214
Вот как пример как работает создание учётки в моде для World of Warcraft
PHP:
<?php

declare(strict_types=1);

namespace app\security;

use Yii;
use yii\base\Exception;

class Security
{
    /**
     * @param int $length
     * @return string
     * @throws Exception
     */
    public function generateRandomString(int $length = 32): string
    {
        return Yii::$app->security->generateRandomString($length);
    }

    /**
     * @param int $length
     * @return string
     * @throws Exception
     */
    public function generateEmailVerificationToken(int $length = 32): string
    {
        return Yii::$app->security->generateRandomString() . '_' . time();
    }

    /**
     * @param string $password
     * @return string
     * @throws Exception
     */
    public function generatePasswordHash(string $password): string
    {
        return Yii::$app->security->generatePasswordHash($password);
    }

    public function validatePassword(
        string $username,
        string $password,
        string $salt,
        string $verifier
    ): bool
    {
        return ($verifier === $this->calculateSRP6Verifier($username, $password, $salt));
    }

    /**
     * @param $username
     * @param $password
     * @return array
     * @throws \Exception
     */
    public function getSRP6RegistrationData($username, $password): array
    {
        $salt = random_bytes(32);
        $verifier = $this->calculateSRP6Verifier($username, $password, $salt);
        return [$salt, $verifier];
    }

    /**
     * @param $username
     * @param $password
     * @param $salt
     * @return string
     */
    public function calculateSRP6Verifier($username, $password, $salt): string
    {
        // algorithm constants
        $g = gmp_init(7);
        $N = gmp_init('894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7', 16);

        // calculate first hash
        $h1 = sha1(strtoupper($username . ':' . $password), TRUE);

        // calculate second hash
        $h2 = sha1($salt . $h1, TRUE);

        // convert to integer (little-endian)
        $h2 = gmp_import($h2, 1, GMP_LSW_FIRST);

        // g^h2 mod N
        $verifier = gmp_powm($g, $h2, $N);

        // convert back to a byte array (little-endian)
        $verifier = gmp_export($verifier, 1, GMP_LSW_FIRST);

        // pad to 32 bytes, remember that zeros go on the end in little-endian!
        // done!
        return str_pad($verifier, 32, chr(0), STR_PAD_RIGHT);
    }
}

А так вот что обычно я использую https://www.php.net/manual/en/function.password-verify.php и https://www.php.net/manual/en/function.password-hash.php
 
  • Нравится
Реакции: Rice.