Saltar al contenido

Generación serial con PHP

Solución:

Si su aplicación tiene una conexión con el servidor, es trivial, simplemente genere tokens aleatorios, guárdelos en una base de datos y solicite que la aplicación vuelva a verificar con el servidor antes de ejecutarse. Sin embargo, algunos clientes pueden encontrar este requisito inaceptable. (Personalmente, nunca compraré ningún software con un requisito de activación por Internet. Quiero comprar software, no alquilarlo).

Para claves con verificabilidad de autenticidad sin tener que tener una conexión al servidor:

  1. En el servidor, genere un token único aleatorio.

  2. Utilice un esquema de criptografía de clave pública (por ejemplo, RSA) para firmar el token con una clave privada que se mantiene en secreto para el servidor.

  3. Codifique el token único y la firma juntos usando algún esquema de binario a texto (por ejemplo, base64, o simplemente usando 2-9A-KMNP-Z símbolos para una mecanografía más segura). La combinación codificada es su clave o número de serie.

  4. Inserte la clave pública que coincida con la clave privada del servidor en cada copia de la aplicación y haga que la aplicación solicite una clave en el momento de la instalación. Puede dividir el token único y la firma, y ​​usar la clave pública para verificar que la firma sea válida para ese token.

Este enfoque requiere que incluya algunas bibliotecas de cifrado con su software, y la mayoría de los algoritmos usan firmas bastante largas, por seguridad, lo que hará que escribir sus números de serie sea bastante tedioso. Está bien si espera que los usuarios copien y peguen los números.

Por estas razones, muchos paquetes de software utilizan un esquema de validación de claves menos seguro en el que el algoritmo de verificación está totalmente integrado en el cliente. Esto podría ser un hash, por ejemplo. los últimos cuatro dígitos hexadecimales de la serie deben coincidir con los dos bytes más bajos del hash SHA1 del resto de la serie combinados con una clave “secreta”. Sin embargo, dado que la clave debe estar incluida en la aplicación, es posible que un pirata informático mire el código de la aplicación y extraiga la clave ‘secreta’, lo que les permitirá escribir sus propios generadores de claves.

Es por eso que para algunos programas verá ‘keygens’ disponibles: la aplicación usó un algoritmo de verificación menos seguro que dejó suficiente información en la aplicación para permitir que el cracker reproduzca el proceso de creación de claves. Para los programas con una configuración más segura basada en la activación de Internet o criptografía de clave pública, normalmente verá una versión ‘descifrada’ de la aplicación, donde el código de verificación ha sido alterado / eliminado.

… lo que demuestra que, hagas lo que hagas, todavía no podrás imponer la honestidad. Así que no se preocupe demasiado por eso.

Aquí está nuestra solución. Genera una clave con un tamaño / longitud configurable y un sufijo opcional basado en un IPv4 válido, ID de usuario (o cualquier número entero significativo) o cadena de texto. También evita caracteres ambiguos (i, 1, l, 0, o, O) en el resultado estándar.

Agregamos el ID de usuario a la licencia y luego podemos convertir esa parte de nuevo en un número entero base10 y verificar si es válida contra la cuenta de usuario que está usando la licencia.

$license = generate_license();
// YF6G2-HJQEZ-8JZKY-8C8ZN

$license = generate_license(123456);
// ZJK82N-8GA5AR-ZSPQVX-2N9C

$license = generate_license($_SERVER['REMOTE_ADDR']);
// M9H7FP-996BNB-77Y9KW-ARUP4

$license = generate_license('my text suffix');
// Q98K2F-THAZWG-HJ8R56-MY-TEXT-SUFFIX

Verificamos la unicidad en la base de datos cuando se crea, pero usando la IP / Userid junto con la aleatoriedad, la probabilidad de duplicados es virtualmente cero.

/**
* Generate a License Key.
* Optional Suffix can be an integer or valid IPv4, either of which is converted to Base36 equivalent
* If Suffix is neither Numeric or IPv4, the string itself is appended
*
* @param   string  $suffix Append this to generated Key.
* @return  string
*/
function generate_license($suffix = null) {
    // Default tokens contain no "ambiguous" characters: 1,i,0,o
    if(isset($suffix)){
        // Fewer segments if appending suffix
        $num_segments = 3;
        $segment_chars = 6;
    }else{
        $num_segments = 4;
        $segment_chars = 5;
    }
    $tokens="ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
    $license_string = '';
    // Build Default License String
    for ($i = 0; $i < $num_segments; $i++) {
        $segment="";
        for ($j = 0; $j < $segment_chars; $j++) {
            $segment .= $tokens[rand(0, strlen($tokens)-1)];
        }
        $license_string .= $segment;
        if ($i < ($num_segments - 1)) {
            $license_string .= '-';
        }
    }
    // If provided, convert Suffix
    if(isset($suffix)){
        if(is_numeric($suffix)) {   // Userid provided
            $license_string .= '-'.strtoupper(base_convert($suffix,10,36));
        }else{
            $long = sprintf("%un", ip2long($suffix),true);
            if($suffix === long2ip($long) ) {
                $license_string .= '-'.strtoupper(base_convert($long,10,36));
            }else{
                $license_string .= '-'.strtoupper(str_ireplace(' ','-',$suffix));
            }
        }
    }
    return $license_string;
}

Mi solución

implode( '-', str_split( substr( strtoupper( md5( time() . rand( 1000, 9999 ) ) ), 0, 20 ), 4 ) );
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *