Я хочу зашифровать / расшифровать лицензионный ключ программного обеспечения в / из базы данных MySQL

Я хочу хранить лицензионные ключи программного обеспечения в поле моего mysql db, но я хочу, чтобы номер лицензии хранился в зашифрованном формате, чтобы в случае компрометации db лицензионные ключи не могли быть использованы.

Возможны 3 сценария с полем лицензионного ключа:

  1. Может быть нулевым - у некоторых пользователей еще не будет лицензионного ключа, хранящегося в БД.
  2. Это может быть лицензия из 25 цифр, с каждыми 5 символами, разделенными переносом: например: ABCD1-EFGH2-IJKL3-MNOP4-QRST5
  3. Это может быть 10-значная лицензия, все из которых являются числами и без разделителей: например: 1234567890

Я хотел бы зашифровать лицензию перед ее сохранением, а затем при отображении пользователю, вошедшему в систему, снова запустить ту же функцию шифрования, чтобы расшифровать лицензию.

Я думаю, что мне нужно начать с проверки strlen лицензии.

  1. Если 0, то ничего не делать. Я могу проверить, является ли его ноль перед загрузкой функции.
  2. Если 29, то используйте разделители дефисов для перемешивания разделов лицензии, таких как 2-й и 4-й, и, возможно, используйте str_rot13 для изменения буквенных символов.
  3. Если 10, выберите, скажем, 3-й, 5-й, 7-й и 9-й символы и измените их порядок. например, 5-й с 9-м и 3-й с 7-м.

Я настроил следующее:

    function scramble($scramblestr) {

    // check string length
    $length = strlen($scramblestr);

    // if 10 digit license (all numbers)
    if ($length == 10) {
        $1st = substr($scramblestr, 0, 1);
        $2nd = substr($scramblestr, 1, 1);
        $3rd = substr($scramblestr, 2, 1);
        $4th = substr($scramblestr, 3, 1);
        $5th = substr($scramblestr, 4, 1);
        $6th = substr($scramblestr, 5, 1);
        $7th = substr($scramblestr, 6, 1);
        $8th = substr($scramblestr, 7, 1);
        $9th = substr($scramblestr, 8, 1);
        $10th = substr($scramblestr, 9, 1);

        // swap 3rd character with 7th / swap 5th character with 9th
        $scramblestr = $1st . $2nd . $7th . $4th . $9th . $6th . $3rd . $8th . $5th . $10th;

    // if 25 digit license (with hyphen separators)
    } elseif ($length == 29) {
        $scramblestr = array_filter(explode('-', $scramblestr), 'strlen');

        // swap 2nd & 4th sections
        $scramblestr = $scramblestr[0] . "-" . $scramblestr[3] . "-" . $scramblestr[2] . "-" . $scramblestr[1] . "-" . $scramblestr[4];

        // swap alpha characters 13 places in the alphabet
        $scramblestr = str_rot13($scramblestr);

    // if null or if stored incorrectly (for example if the license is not null but contains an invalid number of characters)
    } else {
        $scramblestr = "Unknown";
    }

    return $scramblestr;
}

Однако это приводит к следующей ошибке сервера 500:

Ошибка синтаксического анализа PHP: синтаксическая ошибка, неожиданное значение "1" (T_LNUMBER), ожидаемая переменная (T_VARIABLE) или "$"

Это указывает на 1-ю ссылку на подстроку. Однако, согласно php.net, это должно быть целое число, используемое здесь для обозначения длины строки.

Есть идеи?

Или есть более эффективный способ выполнить это действие? Или у кого-нибудь есть альтернативные методы, которые могут подойти?

3 ответа

Решение

"@Fred & CaptainCarl, вы оба были правы, как я мог не осознавать, что... сначала изменил $st на $ и так далее... - BottyZ"

Отправка в качестве ответа:

Проблема здесь в том, что ваши переменные начинаются с числового значения; не могу этого сделать. Сделать что-то вроде $a1st в отличие от $1st пока начинаю с буквы.

Ссылки на стек вы можете прочитать:

Допустимое имя переменной начинается с буквы или подчеркивания, за которым следует любое количество букв, цифр или подчеркивания. Как регулярное выражение, оно будет выражаться так: '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'

https://secure.php.net/manual/en/language.variables.basics.php

Наименование ваших переменных, например $1st является недействительным.

Вы также можете зашифровать данные в базе данных в MySQL 5.7 или MariaDB 10.1. Вы можете сделать это с одним полем, таблицами или заполненным табличным пространством, включая файлы журналов и т. Д.

см.: https://mariadb.com/kb/en/mariadb/encryption/

Другие вопросы по тегам