【问题标题】:PHP license key generatorPHP 许可证密钥生成器
【发布时间】:2011-09-23 17:29:15
【问题描述】:

我正在寻找一种方法来通过 PHP 脚本生成许可证密钥,然后将其传输到我的应用程序(Air、AS3),并在此应用程序中正确读取数据。例如,这里是代码:

<?php
  error_reporting(E_ALL);
  function KeyGen(){
     $key = md5(mktime());
     $new_key = '';
     for($i=1; $i <= 25; $i ++ ){
               $new_key .= $key[$i];
               if ( $i%5==0 && $i != 25) $new_key.='-';
     }
  return strtoupper($new_key);
  }
  echo KeyGen();
?>

生成密钥大概是这样的:1AS7-09BD-96A1-CC8D-F106。 我想将一些信息添加到密钥 - 电子邮件用户中,然后将其传递给客户端(Air 应用程序),解密数据并在应用程序中播放。

有可能吗?

【问题讨论】:

  • 嗯,没那么简单,你需要拥有属于该系列所有者的特定数据才能使其独一无二
  • 需要将多少字节数据存储到“key”中?
  • @RobertPitt。是的,当然,密钥必须是唯一的。
  • MD5 是哈希函数,而不是加密/解密类型的函数。但是,您可以使用 base64 来“编码”(可能是 crypt 供您使用),然后“解码”(在您使用时解密)。它很容易破坏(只是说),但如果它完成了工作,你为什么不使用它呢?请分享更多您的担忧,以便您真正寻找的内容更加突出。你在实施时有问题吗?您是否需要 AS3 和 PHP 中都存在的其他加密/解密函数?
  • 怎么样:散列密钥内的电子邮件地址和一些秘密。将该 MD5 哈希传递给您的 APP 并将其存储在数据库中。在与数据库进行验证时,在响应中返回用户信息。让 APP 保存以备后用。

标签: php actionscript-3 license-key


【解决方案1】:

好的,让我们分解一下您的要求:

你想:

  1. 在密钥中添加一些信息
    那么你想添加什么信息?当你这样做时,你想让密钥更长吗?您是否希望此信息需要密钥才能解密?从最广泛的意义上说,PHP 完全有可能
  2. 电子邮件用户
    PHP 有一个mail() 函数。它几乎可以正常工作。
  3. 然后将其传递给客户端(Air 应用程序)
    空中应用程序是否通过 http 请求调用此 php 脚本?如果是,请设置内容类型并将密钥输出给它。
  4. 解密数据 回到第 1 点,可能,但是您是否需要密钥,并且您是否关心格式是否更改。另外,您不想解密 AS3 应用中的数据吗?
  5. 在应用程序中显示。 如果 AS3 应用要显示密钥或解密的数据,那么您需要在 AS3 中获取它来显示数据。

【讨论】:

  • 谢谢贾斯汀。 1. 我需要通过电子邮件地址(someclientmail@gmail.com),当前日期,一对随机数(在应用程序上检查 - 这是密钥有效性的最简单测试) 2. 哦不,我不需要这个功能。电子邮件我需要然后将其保存在数据库中。 3. 这就是我所知道和能做的。 4. 我可以用于 PHP&AS3 - 例如 base64 和 MD5。 5. 显示邮件举例
【解决方案2】:

如果您只想存储一些信息,但使用上面使用的符号集 (0-9A-Z)“编码”它,您可以使用下面的算法。

代码是我的一个旧的 Python (3) 程序。这当然不是花哨的,也不是经过测试的,但我想总比没有好,因为你还没有得到很多答案。将代码移植到 PHP 或 AS 应该很容易。例如,reduce 语句可以被命令式循环替换。另请注意,// 在 Python 中表示整数除法。

对它进行一些压缩/加密也应该很容易。希望它和你想要的一样。来了。

from functools import reduce

class Coder:
    def __init__(self, alphabet=None, groups=4):
        if not alphabet:
            alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        self.alphabet = alphabet
        self.groups = groups

    def encode(self, txt):
        N = len(self.alphabet)
        num = reduce(lambda x,y: (x*256)+y, map(ord, txt))

        # encode to alphabet
        a = []
        while num > 0:
            i = num % N
            a.append(self.alphabet[i])
            num -= i
            num = num//N

        c = "".join(a)
        if self.groups > 0:
            # right zero pad
            while len(c) % self.groups != 0:
                c = c + self.alphabet[0]
            # make groups
            return '-'.join([c[x*self.groups:(x+1)*self.groups]
                             for x in range(len(c)//self.groups)])
        return c

    def decode(self, txt, separator='-'):
        # remove padding zeros and separators
        x = txt.rstrip(self.alphabet[0])
        if separator != None:
            x = x.replace(separator, '')
        N = len(self.alphabet)
        x = [self.alphabet.find(c) for c in x]
        x.reverse()
        num = reduce(lambda x,y: (x*N)+y, x)

        a = []
        while num > 0:
            i = num % 256
            a.append(i)
            num -= i
            num = num//256
        a.reverse()
        return ''.join(map(chr, a))

if __name__ == "__main__":
    k = Coder()
    s = "Hello world!"
    e = k.encode(s)
    print("Encoded:", e)
    d = k.decode(e)
    print("Decoded:", d)

示例输出:

Encoded: D1RD-YU0C-5NVG-5XL8-7620
Decoded: Hello world!

【讨论】:

    【解决方案3】:

    使用 md5 你不能这样做,因为这是一个单向哈希。您应该使用解密方法来执行此操作,因为它使用密钥对其进行编码和解码。有几个 php 扩展可以做到这一点,请参阅 php 手册。您也可以为此使用第三方软件,例如http://wwww.phplicengine.com

    【讨论】:

      猜你喜欢
      • 2011-02-24
      • 2012-02-29
      • 2012-02-22
      • 2011-03-01
      • 2012-01-24
      • 2022-03-21
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      相关资源
      最近更新 更多