我想将软件许可证密钥存储在我的 mysql 数据库的一个字段中,但我希望将许可证号以加扰格式存储,这样如果数据库被泄露,许可证密钥将无法使用。
许可证密钥字段可能有 3 种情况:
- 它可能为空 - 一些用户还没有存储在数据库中的许可证密钥。
- 它可能是 25 位的许可证,每 5 个字符用连字符分隔:例如:ABCD1-EFGH2-IJKL3-MNOP4-QRST5
- 可能是10位的license,都是数字,没有分隔符:例如:1234567890
我想在存储之前对许可证进行加扰,然后在登录后向用户显示时,再次运行相同的加扰功能来解扰许可证。
我想我需要从检查许可证的 strlen 开始。
- 如果为 0,则什么也不做。我可以在加载函数之前检查它是否为空。
- 如果是 29,则使用连字符分隔符来打乱许可证的部分,例如 2nd 和 4th,并且可能使用 str_rot13 来更改字母字符。
- 如果是 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 解析错误:语法错误、意外的 '1' (T_LNUMBER)、期望变量 (T_VARIABLE) 或 '$'
这指向第一个 substr 引用。但是,根据 php.net,它应该是一个整数,用于标记字符串的长度。
有任何想法吗?
还是有更有效的方法来执行此操作?或者有没有人有任何可能适合的替代方法?