我想将软件许可证密钥存储在我的mysql数据库的一个字段中,但我希望以乱码格式存储许可证号,这样如果数据库被泄露,许可证密钥将无法使用。
许可证密钥字段有三种可能的情况:
我想在存储之前加扰许可证,然后在登录后向用户显示时,再次运行相同的加扰功能以解密许可证。
我想我需要先检查许可证的格式。
我设置了以下内容:
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 Parse错误:语法错误,意外的'1'(T_LNUMBER),期待 变量(T_VARIABLE)或'$'
这指向第一个子参考。但是,根据php.net,它应该是一个整数,用于标记字符串的长度。
有什么想法吗?
或者是否有更有效的方法来执行此操作?或者是否有人有任何可能适合的替代方法?
答案 0 :(得分:6)
“@ Fred& CaptainCarl你们都是对的,我怎么能没有意识到...将$ st改为$ first等等...... - BottyZ”
提交答案:
这里的问题是你的变量以数值开头;不能那样做。在以字母开头的时候做$a1st
而不是$1st
。
Stack上的参考文献你可以阅读:
答案 1 :(得分:1)
有效的变量名称以字母或下划线开头,后跟任意数量的字母,数字或下划线。作为正则表达式,它将表达为:' [a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'
https://secure.php.net/manual/en/language.variables.basics.php
变量的命名,例如$1st
无效。
答案 2 :(得分:0)
您还可以在MySQL 5.7或MariaDB 10.1中加密数据库中的数据。您可以使用单个字段,表或已完成的表空间(包括日志文件等)来执行此操作。