我想将软件许可证密钥加密/解密到mysql数据库中

时间:2016-04-13 14:01:01

标签: php mysql syntax-error scramble

我想将软件许可证密钥存储在我的mysql数据库的一个字段中,但我希望以乱码格式存储许可证号,这样如果数据库被泄露,许可证密钥将无法使用。

许可证密钥字段有三种可能的情况:

  1. 它可能为null - 某些用户还没有存储在数据库中的许可证密钥。
  2. 它可能是一个25位数的许可证,每5个字符由一个超级分隔:例如:ABCD1-EFGH2-IJKL3-MNOP4-QRST5
  3. 它可能是10位数的许可证,所有这些都是数字而且没有分隔符:例如:1234567890
  4. 我想在存储之前加扰许可证,然后在登录后向用户显示时,再次运行相同的加扰功能以解密许可证。

    我想我需要先检查许可证的格式。

    1. 如果为0,则不执行任何操作。我可以在加载函数之前检查它是否为null。
    2. 如果是29,则使用连字符分隔符来重新排列许可证的各个部分,例如第2和第2部分。 4,也许使用str_rot13来改变字母字符。
    3. 如果是10,请选择说第3,第5,第7,和第9个字符并改变他们的顺序。比如第5名第9名和第3名第7名。
    4. 我设置了以下内容:

          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,它应该是一个整数,用于标记字符串的长度。

      有什么想法吗?

      或者是否有更有效的方法来执行此操作?或者是否有人有任何可能适合的替代方法?

3 个答案:

答案 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中加密数据库中的数据。您可以使用单个字段,表或已完成的表空间(包括日志文件等)来执行此操作。

请参阅:https://mariadb.com/kb/en/mariadb/encryption/