2016-04-13 4 views
1

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

Есть 3 типа сценариев с поля ключа лицензии:

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

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

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

  1. Если 0, то ничего не делайте. Я могу проверить, не имеет ли значение null перед загрузкой функции.
  2. Если 29, то используйте разделители дефиса, чтобы перетасовать разделы лицензии, например, 2 & 4th и, возможно, использовать 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 Parse error: syntax error, unexpected '1' (T_LNUMBER), expecting variable (T_VARIABLE) or '$'

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

Любые идеи?

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

+0

Не совсем уверен: Но переменная не может быть (частично) числовой, не так ли? – CaptainCarl

+0

Почему бы вам просто не сделать это? – Daan

+0

См. Ответ [здесь] (http://stackoverflow.com/questions/16600708/how-do-you-encrypt-and-decrypt-a-php-string) – LMS94

ответ

6

"@Fred & CaptainCarl you were both right, how could I of not realised that... changed the $st to $first and so on... – BottyZ"

Посылаем в качестве ответа:

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

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

+0

ДАЙ МНЕ НАЗАД МОЙ КРЕДИТЫ! Нет, я рад, что все получилось. – CaptainCarl

+1

@CaptainCarl У меня есть ;-) –

+0

спасибо за помощь. – BottyZ

1

A valid variable name starts with a letter or underscore, followed by any number of letters, numbers, or underscores. As a regular expression, it would be expressed thus: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

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

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

0

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

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