AsviS
@AsviS
начинающий

Как генерировать ключ?

Всем привет!
Суть вопроса такова:
Как мне сделать генератор ключей что бы можно было использовать секретный ключ, и что бы ключ при выходе получился XXXXX-XXXXX-XXXXX-XXXXX ?
раньше использовал простой код:

<?php
function sernum()
{
    $template   = 'XXX99-XXX99-99XXX-99XXX';
    $k = strlen($template);
    $sernum = '';
    for ($i=0; $i<$k; $i++)
    {
        switch($template[$i])
        {
            case 'X': $sernum .= chr(rand(65,90)); break;
            case '9': $sernum .= rand(0,9); break;
            case '-': $sernum .= '-';  break; 
        }
    }
    return $sernum;
}
echo '<pre>';

for ($i=0; $i < 10; $i++) echo sernum(), '<br/>';

echo '</pre>';
?>

и писал ключи в БД. Дальше уже работал с БД.
но сейчас нужно добавить к нему еще секретный ключ(слово)
что бы можно генерировать на PHP и C# и проверять валидацию,
например на PHP проверять буду просто, сверять запись в БД, а через приложение на C# нужно в offline режиме проверять!
  • Вопрос задан
  • 2394 просмотра
Решения вопроса 1
27cm
@27cm
TODO: Написать статус
Например, можно сделать так: https://3v4l.org/LHe5q
<?php

define('SECRET', 'tostersecretcode2015');

/**
 * Создаёт серийный номер с заданной проверочной частью.
 * 
 * @param string $check Часть серийного номера, используемая для проверки.
 * 
 * @return bool
 */
function sernum ($check = null)
{
    $template   = 'XXX99-XXX99-99XXX-99XXX';
    
    $parts = explode('-', $template, 2);
    if (!isset($check)) {
        $check = '';
        for ($i = 0; $i < strlen($parts[0]); $i++) {
            switch ($parts[0][$i]) {
                case 'X': $check .= chr(rand(65, 90)); break;
                case '9': $check .= strval(rand(0,9)); break;
            }
        }
    }
    
    $sernum = $check . '-';
    $hash = hash('sha256', $check . SECRET);
    
    for ($i = 0; $i < strlen($parts[1]); $i++) {
        switch ($parts[1][$i]) {
            case 'X': $sernum .= chr(65 + ord($hash[$i]) % 26); break;
            case '9': $sernum .= strval(ord($hash[$i]) % 10); break;
            case '-': $sernum .= '-';  break; 
        }
    }
    
    return $sernum;
}

/**
 * Проверяет серийный номер.
 * 
 * @return bool
 */
function check_sernum ($sernum)
{
    $parts = explode('-', $sernum, 2);
    return (sernum($parts[0]) === $sernum);
}


echo '<pre>Десять случайных номеров:<br>';
for ($i = 0; $i < 10; $i++) 
    echo sernum(), '<br/>';

if (check_sernum('XCC58-AYA68-75ZUU-19TDZ')) {
    echo 'Номер XCC58-AYA68-75ZUU-19TDZ прошёл проверку<br>';
}

if (!check_sernum('ESJ18-TBZ25-42XDX-38XWY')) {
    echo 'Номер ESJ18-TBZ25-42XDX-38XWY не прошёл проверку<br>';
}


Алгоритм создания серийного номера:
1. Разбиваем шаблон XXX99-XXX99-99XXX-99XXX на две части: XXX99 и XXX99-99XXX-99XXX
2. Для первой части XXX99 используем случайные буквы и цифры. Получаем, например: XCC58
3. Вычисляем SHA256 хеш для строки ('XCC58' . SECRET)
4. Используем коды символов полученного хеша, чтобы получить оставшуюся часть ключа, и подстроить её под шаблон XXX99-99XXX-99XXX. Получаем AYA68-75ZUU-19TDZ.
5. Объединяем две полученные строки - серийный номер готов.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы