首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何生成激活密钥(或串行密钥)

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

Stack Overflow用户
提问于 2015-08-07 09:09:41
回答 2查看 1.9K关注 0票数 0

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

我需要的是加密这两个值,这样我就可以像这样: TRE-3DR-SER-WER-67J-AX3 (类似这样),也可以解密成它的原始值。

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

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

EN

回答 2

Stack Overflow用户

发布于 2015-08-07 09:17:10

你应该保持激活密钥是独立的,并且与过期日期和用户ID无关。这实际上是在创建一种方法来解密你自己的密钥。取而代之的是,让你的表格类似于下表。

代码语言:javascript
复制
+----------------------------------------+
|   UserID    |    Key    |    Expiry    |
+----------------------------------------+

然后您就可以生成ID:

代码语言:javascript
复制
<?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/100万次机会~)

票数 3
EN

Stack Overflow用户

发布于 2015-08-07 09:55:45

编码:

代码语言:javascript
复制
 $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

解码:

代码语言:javascript
复制
 $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和日期/时间分开。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31868169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档