PHP | Класс регистрации под 3.3.5a

im0rg

New member
Команда форума
Премиум
Регистрация
02.05.2022
Сообщения
10
Реакции
9
Баллы
0
Местоположение
Cheb
Сайт
boobywow.ru
Почитал на форуме что у многих проблема с регистрацией и авторизацией пользователя под 3.3.5a
Выкладываю свой код под фреймворк Yii2, с базовыми знаниями PHP думаю ни у кого не составит труда этот класс переписать под себя


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

Ели есть вопросы задавайте, чем смогу помогу
 

zgn1988

Dev WoW EMU
Модератор
Регистрация
31.10.2020
Сообщения
53
Реакции
46
Баллы
0
Возраст
35
Местоположение
Россия
Сайт
github.com
example
а чем свой код регистрации SRP6 отличается от стандартного, который по другому просто не работает?
 

im0rg

New member
Команда форума
Премиум
Регистрация
02.05.2022
Сообщения
10
Реакции
9
Баллы
0
Местоположение
Cheb
Сайт
boobywow.ru
example
а чем свой код регистрации SRP6 отличается от стандартного, который по другому просто не работает?
На самом деле ничем, просто я его вынес в отдельный класс для удобства работы, почитал по форуму что многие аналогичные темы вываливают сразу готовую страницу и у многих вопрос именно к отдельному участку кода. В моём же примере показан механизм SRP6 в рамках одного класса и ничего лишнего
 
Верх Низ