[Dúvida] Como fazer o recurso de licenças

Estou com uma dúvida, como criar um sistema de licenças para minha aplicação java. Já existe alguma API? Estou precisando vender softwares mas quero por licenças (seriais)…
Abraços

Desconheço uma solução comercial pronta para isso, pois normalmente é um segredo seu e de seu software.
a dica é trabalhar com licenças baseadas no MAC da placa de rede, que é acessivel no Java.

Nas minhas eu trabalho com data tb, para impedir que o usuario use pra sempre…
ai sempre que fecho o programa guardo a data do PC.
assim consigo saber se ele esta tentando voltar o relogio :slight_smile:
haehahehaheae, era isso.

Mais como falado em 200 topicos aqui do GUJ, sempre é possivel quebrar.
ainda mais se a sua app ficar popular, e cair na mão de um programador java.

[quote=dyorgio]Desconheço uma solução comercial pronta para isso, pois normalmente é um segredo seu e de seu software.
a dica é trabalhar com licenças baseadas no MAC da placa de rede, que é acessivel no Java.[/quote]
Mas para tanto é preciso usar APIs a parte, certo? Ou existe algum método para fazer isso somente com as APIs do JRE?

A JRE tem tudo…:smiley: \o/

assim:

byte[] mac = NetworkInterface.getNetworkInterfaces().nextElement().getHardwareAddress();

claro…ai peguei da primeira, o certo é ir vendo uma a uma, e eliminando a de lookback e as virtuais.
tentando achar a fisica apenas.

Interessante… dessa eu não sabia. Da última vez que fui mexer com MAC usei uma API externa (bom, na verdade precisei mesmo pois o programa não se limitava a verificar o MAC da máquina local; ele analisava o que entrava e saia da placa de rede).

Oi,

Realmente interessante… como o método getNetworkInterfaces() retorna um Enumeration, você poderá pegar todos os MACs da maquina utilizando a função hasMoreElements().

Tchauzin!

Bom dia, realmente gostei. Porém, como distinguir qual é a física? Tem como nos dizer como fez pra saber qual é o MAC real? Pois em minha máquina eu tenho duas físicas e uma virtual. Agradeço a ajuda, e já estou fazendo criptografia. Tocando no assunto de criptografia, eu soube que há um programa que criptografa nossas aplicações para que programadores java não abram para ver o código usando um decompiler da vida. Alguém sabe sobre isto? Sabe se é válido? Pois tenho clientes que comprar aplicações mas estão nem querendo pagar mais atualizações porque eles já tem o código e podem mexer. u.ú

Agradeço a ajuda…

Procure por obfuscador de código Java (tem um muito bom no SF, só não lembro o nome). Lembre-se que essas ferramentas apenas atrapalham a decompilação mas não a impedem.

Humm, SF ? O.o
Bom se puder me enviar uma MP com o link seria bom. O problema é esse queria ver se consigo pelo menos obfuscar a maioria do código. Aguardo ^^ e agradeço pela help.

SF = SourceForge :slight_smile:

O nome do obfuscador é ProGuard e pode ser encontrado aqui: http://proguard.sourceforge.net/

Desculpe a demora CaioO, estou sem net em casa :(, derrota…

segue o codigo que uso, ele ja esta bem maduro, e tem partes dele que nem lembro porque fiz :slight_smile:
mais sei que esta totalmente funcional :slight_smile:

segue :

/**
	 * Carrega a identificação do computador através do MAC da placa de rede.
	 * 
	 * @return A identificação do computador.
	 * @throws SocketException
	 *             Caso ocorra algum problema relacionado a I/O durante o
	 *             processo.
	 */
	public static byte[] getComputerIdentifier() throws SocketException {
		NetworkInterface bestInterface = null;
		final Enumeration<NetworkInterface> interfaces = NetworkInterface
				.getNetworkInterfaces();

		Field indexField = null;
		try {
			indexField = NetworkInterface.class.getDeclaredField("index");
                        indexField.setAccessible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
		

		while (interfaces.hasMoreElements()) {
			final NetworkInterface atualInterface = interfaces.nextElement();
			if (!atualInterface.isLoopback() && !atualInterface.isVirtual()
					&& !atualInterface.isPointToPoint()
					&& atualInterface.getHardwareAddress() != null) {
				try {
					if (bestInterface == null
							|| (indexField == null || indexField
									.getInt(bestInterface) > indexField
									.getInt(atualInterface))) {
						bestInterface = atualInterface;
						InetAddress address = InetAddress.getLocalHost();
						NetworkInterface.getByInetAddress(address);
						if (indexField == null) {
							break;
						}
					}
				} catch (Exception e) {
					e.printStackTrace();
				}

			}
		}

		if (bestInterface != null) {
			return bestInterface.getHardwareAddress();
		} else {
			throw new RuntimeException(
					"Nenhuma interface de rede habilitada para identificação do computador encontrada.");
		}
	}

Oi Dyorgio,

Não entendi algumas coisas do método, poderia me explicar?

Por exemplo, a utilização da variavel Field indexField.

Tchauzin!

Essa variavel é um hack :slight_smile:
estou usando reflexão para obter acesso a uma variavel privada do NetworkInterface,
que é o index da interface no sistema.

assim se eu conseguir obter essa variavel via reflection eu uso ela para dar prioridade as minhas interfaces…

ou seja, pego a com index menor, pois julgo ser a interface fisica primaria do computador.

ela sempre esta la, mais como é private trato a possibilidade da não-existencia dela tb :), HACK, POG, “ajuste fino” haehahehaehahehae

Oi,

Entendi agora… Obrigada

Tchauzin!

[quote=CaioO]Estou com uma dúvida, como criar um sistema de licenças para minha aplicação java. Já existe alguma API? Estou precisando vender softwares mas quero por licenças (seriais)…
[/quote]

A licença tem dois objetivos

  1. Permitir que o sistema seja usado em conformidade com o contrato
  2. Validar que o sistema está sendo usado em conformidade com um contrato.

Se o contrato declara uma validade para a licença, isso significa que a licença electronica do sistema expirará no mesmo dia.
Se o sistema não encontrar uma licença válida, ele simplesmente não funciona.

As propriedades que o contrato impoe são variadas e podem ser tão complexas quando o proprio contrato. Portanto é impossivel criar um modelo de licença que atenta a todos.

A forma mais simples de uma licença é a criação de um properties com as propriedades que a licença tem. Data de validade, nome da empresa, numero de usuarios simultaneos, features permitidas, etc…

Depois vc usa um algoritmo de encriptação de chave publica-privada duplo.

O cliente entra no sistema sem licença. O sistema sabe isto e mostra uma tela para entrar dados de licença.
O sistema gera um par de chaves. guarda a privada e envia a publica para si.

Vc gera outro par de chaves. guarda a privada que gerou e a publica que recebeu num sistema de gerenciamento de licenças (sim, vc precisa criar este sistema)
Vc usa as duas chaves para encriptar o arquivo. primeiro a publica vinda do sistema e depois a privada que vc gerou.
Ai vc enviar a publica que vc gerou e o arquivo de licença (se quiser pode inventar um formato de arquivo para mandar as duas coisas num arquivo so).

O sistema verifica que existe um arquivo de licença , a chave privada que ele guardou e a publica que foi enviada. Ele usa os três para abrir o arquivo de properties.

Informações como a ultima data em que o sistema foi usado pode ser guardada no registro usando a Properties API (não a classe Properties).
encriptar isso pode tb ajudar, mas tem que ter cuidado em tratar a ausencia de informações anteriores.

Todo este esquema não evita que alguem faça um hack no seu codigo e modifque as classes que testam as propriedades da licença. Isso é um outro problema. (dica: vc pode codificar as classes com o mesmo algoritmo, e criar um Classloader especial que carregue as classes “autenticas”).

Não vincule a licença a propriedades da máquina porque isso pode mudar (se cara muda a placa de rede ou muda de computador). Vc vai criar trabalho para si mesmo. Mas a escolha é sua…

[quote=sergiotaborda][quote=CaioO]Estou com uma dúvida, como criar um sistema de licenças para minha aplicação java. Já existe alguma API? Estou precisando vender softwares mas quero por licenças (seriais)…
[/quote]

A licença tem dois objetivos

  1. Permitir que o sistema seja usado em conformidade com o contrato
  2. Validar que o sistema está sendo usado em conformidade com um contrato.

Se o contrato declara uma validade para a licença, isso significa que a licença electronica do sistema expirará no mesmo dia.
Se o sistema não encontrar uma licença válida, ele simplesmente não funciona.

As propriedades que o contrato impoe são variadas e podem ser tão complexas quando o proprio contrato. Portanto é impossivel criar um modelo de licença que atenta a todos.

A forma mais simples de uma licença é a criação de um properties com as propriedades que a licença tem. Data de validade, nome da empresa, numero de usuarios simultaneos, features permitidas, etc…

Depois vc usa um algoritmo de encriptação de chave publica-privada duplo.

O cliente entra no sistema sem licença. O sistema sabe isto e mostra uma tela para entrar dados de licença.
O sistema gera um par de chaves. guarda a privada e envia a publica para si.

Vc gera outro par de chaves. guarda a privada que gerou e a publica que recebeu num sistema de gerenciamento de licenças (sim, vc precisa criar este sistema)
Vc usa as duas chaves para encriptar o arquivo. primeiro a publica vinda do sistema e depois a privada que vc gerou.
Ai vc enviar a publica que vc gerou e o arquivo de licença (se quiser pode inventar um formato de arquivo para mandar as duas coisas num arquivo so).

O sistema verifica que existe um arquivo de licença , a chave privada que ele guardou e a publica que foi enviada. Ele usa os três para abrir o arquivo de properties.

Informações como a ultima data em que o sistema foi usado pode ser guardada no registro usando a Properties API (não a classe Properties).
encriptar isso pode tb ajudar, mas tem que ter cuidado em tratar a ausencia de informações anteriores.

Todo este esquema não evita que alguem faça um hack no seu codigo e modifque as classes que testam as propriedades da licença. Isso é um outro problema. (dica: vc pode codificar as classes com o mesmo algoritmo, e criar um Classloader especial que carregue as classes “autenticas”).

Não vincule a licença a propriedades da máquina porque isso pode mudar (se cara muda a placa de rede ou muda de computador). Vc vai criar trabalho para si mesmo. Mas a escolha é sua…

[/quote]

Oi,

Perfeita a sua colação. A minha aplicação hoje faz esse tipo de licença.
No contrato o Cliente informa a quantidade de Lojas que irá ter o software instalado (Caso tenho uma rede comercial de 5 lojas, deverá ser confirmado no cadastro 5 lojas), a data de validade de contrato, CNPJ etc…

Geramos um código criptografado e enviamos para o Cliente. Caso o cliente (via sistema) tentar alterar os dados de cadastro e o mesmo não bater com o código seguro, automaticamente é mostrado uma mensagem de segurança.

Caso a data de expiração para o uso do sistema acabar, deverá ser entrado em contato com a empresa do Software solicitando um novo código Seguro.

Este controle do MAC é viável para controle interno de uma aplicação. Ex: Se você tem um Servidor onde vários Clients requerem autenticação… Caso não esteja cadastrado o MAC, nada feito.

Tchauzin!

Eu ja acho valido o uso do MAC para controlar licenças…
mais apenas se for feito um gerenciador de licenças como o nosso amigo falou,
no caso ficaria semelhante a PSN (rede do Playstation 3)

onde vc tem um usuario e seus softwares.
e cada software pode ser baixado em 5 maquinas diferentes.

assim vc elimina o problema de troca/perda/queimação da placa de rede.

pois isso ocorrer 5 vezes com o mesmo cliente é praticamente impossivel.

e se o cliente querer compartilhar com mais pessoas as suas licenças:

  1. tera que compartilhar a senha/e-mail dono da licença.

  2. se perder a placa de rede/computador ja era :), escolha dele.

Isso depende do tempo que o cliente usar seu software, e do tamanho do cliente também. As probabilidades aumentam com o tempo de uso e a quantidade de máquinas.

Dispositivos de hardware precisam ser trocados periodicamente, e é muito improvável que seja escolha do cliente - principalmente quando ele sabe que isso o prejudica não somente em termos de hardware, mas também em termos de software.

vc esta me dizendo que para a minha licença de 1 ano eu tenho que aceitar que o cliente troque de
maquina 5 vezes? o que tu me diz do windows OEM? que vale apenas pra maquina que foi comprado?

a escolha do cliente do item 2 se refere a ele dar 4 licenças para outras pessoas…
logo foi uma escolha dele, deu uma de malandro e quando precisou não tinha mais.

cara, não estou inventando a roda, é assim que funciona no PS3, e muito bem por sinal.

E você espera que o cliente use um software desenvolvido por você apenas por um ano?

Só porque foi desenvolvido para o Playstation 3 não significa que sirva para todos os infinitos casos.