2015-08-07 2 views
0

Моя проблема заключается в следующем: У меня есть идентификатор пользователя: 0001 и выдохе код: 2015-10-10 12:00Как создать ключ активации (или серийный ключ)

Что мне нужно для шифрования два значения, так что у меня могут быть некоторые: TRE-3DR-SER-WER-67J-AX3 (что-то вроде этого), а также можно дешифровать до его первоначальных значений.

То, что я сделал, это совместить два значения, удалить пробелы и тире и создать букву или число, эквивалентное одному символу.

Моя проблема: я хочу, чтобы сгенерированный ке был более безопасным и сложным для декодирования и, если возможно, более короткой строки.

+1

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

+0

Итак, вы хотите иметь собственное, настраиваемое и безопасное шифрование? Я предпочел бы использовать существующие решения ... :) – sinisake

+0

Выполнение ваших требований и сложность декодирования - две взаимоисключающие цели. – gunwin

ответ

3

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

+----------------------------------------+ 
| UserID | Key | Expiry | 
+----------------------------------------+ 

Чем вы можете сгенерировать ID:

<?php 
function sernum() 
{ 
    $template = 'XX99-XX99-99XX-99XX-XXXX-99XX'; 
    $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; 
} 


// try it, lets generate 4 serial numbers 
echo '<pre>'; 

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

echo '</pre>'; 
?>  

Выход:

WS41-IZ91-55XO-23WA-WVZS-20VK

SJ42-CV50- 79DA-55UV-TERR-28IJ

LY80-CN84-69LV-73EW-ZZEU-09AI

IS86-RG15-39CG-38HK-XLUG-86FO

Затем проверьте, чтобы увидеть, если сгенерированный ключ используется (1/1000000 шанс ~)

+0

Благодарим вас за ответ. Да, я знаю, что практика плоха, но все же я хочу это сделать. Я также знаю, что срок действия даты должен быть отделен, и я могу просто проверить через mysql, если пользователь истёк. Что я хочу знать, так как я могу сделать шифрование сложнее для декодирования. – reignsly

+0

Единственный способ сделать серийный ключ длиннее, вы можете отредактировать шаблон в функции 'sernum()', чтобы сделать его длиннее или короче, содержать больше чисел или содержать больше букв. Декодирование ничего не выявило бы. Компании с миллиардом долларов все еще задают этот вопрос и терпят неудачу, поэтому не пытайтесь усердно. – zanderwar

+1

@ Zanderwar Это не компании с миллиардами долларов, которые терпят неудачу, это кодеры, которых эти дешевые ублюдки нанимают ;-) не говоря уже о том, как хакеры становятся все более и более подкованными. –

-1

Кодирование:

$user = "0001"; //Solution only works if this value is always 4 characters. 
$datetime = "2015-10-10 12:00"; 

$reps = array("-", " ", ":"); 
$unencoded = $user . str_replace($reps, "", $datetime); 
//gives: 001201510101200 

$encoded = strtoupper(base64_encode($unencoded)); 

//This will always be 20 characters long 
//Result: MDAXMJA5OTK5OTAXMJAW 

$finalCode = substr($encoded, 0, 5) . "-" 
       .substr($encoded, 4, 5) . "-" 
       .substr($encoded, 9, 5) . "-" 
       .substr($encoded, 14, 5) . "-" 

//result: MDAXM-JA5OT-K5OTA-XMJAW 

Decode:

$input = "MDAXM-JA5OT-K5OTA-XMJAW"; 

$encoded = str_replace("-", "", $input); 
$decoded = base64_decode($encoded); 

$year = substr($decoded, 4, 4); 
$month = substr($decoded, 8, 2); 
$day = substr($decoded, 10, 2); 
$hour = substr($decoded, 12, 2); 
$min = substr($decoded, 14, 2); 

$userid = substr($decoded, 0, 4); 
$date = new DateTime($year . "-". $month . "-" .$day. " ".$hour.":".$min); 

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

Смежные вопросы