Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何生成激活密钥(或串行密钥)_Php_Serialization - Fatal编程技术网

Php 如何生成激活密钥(或串行密钥)

Php 如何生成激活密钥(或串行密钥),php,serialization,Php,Serialization,我的问题是: 我有一个用户id:0001 有效期代码:2015-10-10 12:00 我需要的是对这两个值进行加密,这样我就可以得到一些类似的值: TRE-3DR-SER-WER-67J-AX3(类似于此),也可以解密为其原始值 我所做的是混淆这两个值,删除空格和破折号,并创建一个相当于单个字符的字母或数字 我的问题是我希望生成的kay更安全,更难解码,如果可能的话,字符串更短。您应该将激活密钥分开,并且与过期日期和用户ID无关。这实际上是在创建一种方法来解密您自己的密钥。相反你的桌子和下面的

我的问题是: 我有一个用户id:0001 有效期代码:2015-10-10 12:00

我需要的是对这两个值进行加密,这样我就可以得到一些类似的值: TRE-3DR-SER-WER-67J-AX3(类似于此),也可以解密为其原始值

我所做的是混淆这两个值,删除空格和破折号,并创建一个相当于单个字符的字母或数字


我的问题是我希望生成的kay更安全,更难解码,如果可能的话,字符串更短。

您应该将激活密钥分开,并且与过期日期和用户ID无关。这实际上是在创建一种方法来解密您自己的密钥。相反你的桌子和下面的相似

+----------------------------------------+
|   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机会~)

编码:

 $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);
解码:


注意:我不建议这样做,这是非常不安全的。我会按照其他一些答案的建议,让您的代码随机,并与用户ID和日期/时间分开。

这样做,您就允许使用解密技术。您应该生成一个随机密钥,并将其分配给一个userid和一个过期表,但将它们分开。那么,您想要自己的、自定义的和安全的加密吗?我宁愿使用现有的解决方案……:)满足您的需求和难以破解是两个相互排斥的目标。谢谢您的回答。是的,我知道这种做法很糟糕,但我还是想这样做。我也知道过期日期应该分开,我可以通过mysql检查用户是否过期。我想知道的是如何使加密更难解码。唯一的方法是使序列密钥的长度更长,您可以在
sernum()
函数中编辑模板,使其更长或更短,包含更多的数字或包含更多的字母。破译它无论如何也不会透露任何信息。数十亿美元的公司仍然在问这个问题,而且失败了,所以不要努力。@Zanderwar失败的不是数十亿美元的公司,而是那些廉价混蛋雇佣的程序员;-)更不用说黑客们是如何变得越来越精明。更不用说更年轻了:P
 $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);