我的问题是:我有一个用户id : 0001,过期代码: 2015-10-10 12:00
我需要的是加密这两个值,这样我就可以像这样: TRE-3DR-SER-WER-67J-AX3 (类似这样),也可以解密成它的原始值。
我所做的是将两个值混淆,删除空格和破折号,并创建一个相当于单个字符的字母或数字。
我的问题是,我希望生成的kay更安全,更难解码,如果可能的话,还希望字符串更短。
发布于 2015-08-07 09:17:10
你应该保持激活密钥是独立的,并且与过期日期和用户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/100万次机会~)
发布于 2015-08-07 09:55:45
编码:
$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解码:
$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和日期/时间分开。
https://stackoverflow.com/questions/31868169
复制相似问题