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

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.[/quote]

Ai,ai, e dale framer :twisted: :twisted: :twisted: :twisted:

A cara, isso serve pra mim, e o que eu faço com meus clientes é problema meu

e o que é 5? 5 é um numero, pode ser 1000, pode ser 1…o universo é tão grande…
pense nisso…

aqui o dono do topico pediu dicas/ideias

estou dando de bom grado a minha, cade a sua?!?!

voltarei a minha meditação em GridBagLayout roots

:shock:

:shock: :shock: :shock: :shock:

só loco aqui :slight_smile:

vai dizer?

vcs não gostam? soh assim pra ficar do jeito que quero, sem erro.

[quote=dyorgio]só loco aqui :slight_smile:

vai dizer?

vcs não gostam? soh assim pra ficar do jeito que quero, sem erro.[/quote]
http://www.miglayout.com

se entrar mesmo no Java 7, quem sabe…

eu não tenho dificuldade com o GBL,
ja com o Mig, terei a dificuldade inicial de aprendizagem…
desnecessario…

Mais voltando ao assunto do topico…a questão da licença ser valida por um ano…

não significaria que o usuario não poderia usar mais o programa…
e sim, que ele teria que revalidar a sua licença a custo zero ou pequeno para uma atualização.
todo ano…como a maioria dos softwares fazem…

[quote=dyorgio]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.
[/quote]

Cada vez que o cara adiciona uma máquina nova vc gera uma nova licença ?

Vamos pensar que o cara tem uma máquina já com o sistema instalado.
Agora ele está preparando uma maquina num datacenter para vir a ser o seu novo servidor.

como está amarrado no MAC, o cliente precisa pedir uma nova licença para aquele servidor e para fazer a migração ele precisa de duas licenças.
O seu sistema contém agora duas licenças. Uma original que permitia o endereço da primeira máquina
e uma segunda que permite ambos.

Agora o cara terminou de migrar tudo e desabilitou o servidor original. Como vc sabe disso ? como vc invalida essa licença ? Repare que ele só comprou 1 licença, mas vc lhe deu duas. Se vc o obriga a pagar duas ele vai se queixar.

Para que a licença seja atralada ao MAC ele tem que estar no properties que falei, e o sistema tem que testar se é igual.
Vc gerou duas licenças para MAC diferentes. Mas não tem como invalidar a primeira licença , portanto vc deu ao cara duas licenças que ele agora pode
usar para por duas máquinas no datacenter.

Por outro lado, agora quem controla a máquina é o data cenrter. Imagine que eles precisam mudar a placa de rede . Nem vc , nem o cliente sabem disto e o sistema para de funcionar. Ou imagine que duas aplicações de clientes diferentes usam a mesma placa de rede. E agora ?

duas palavras: inferno logistico.

O sistema pode ter outros mecanismo de garantir uma instancia apenas , mesmo em rede. O problema só acontece quando a aplicação é standalone.
E nesse caso vc utiliza um servidor de licença, ou seja, um sistema externo que serve apenas para verificar a licença, o sistema do cliente tem que fazer handshake e validar a licença periodicamente com o seu servidor central. Ai sim, vc pode usar o MAc para verificar que o pedido veio de lugares diferentes, mas o numero do MAc em si é irrelevante.

é mais simples do que tudo isso ai que vc falou cara.

o cara não precisa me pagar…ele tem direito a 5

não preciso desativar a primeira, ela expira depois de um ano.

e a chave pode ser a mescla (md5 por exemplo)
do mac + email/usuario dono da licença…

simples assim :slight_smile:

e no caso de datacenters, esse tipo de cliente não tentaria burlar,
pois a multa é grande se descoberto.

é engraçado, varias pessoas dizem que não da certo…mais da, tentem :), confia…haehhaehahehaehahe

[quote=dyorgio]é mais simples do que tudo isso ai que vc falou cara.

o cara não precisa me pagar…ele tem direito a 5

não preciso desativar a primeira, ela expira depois de um ano.

e a chave pode ser a mescla (md5 por exemplo)
do mac + email/usuario dono da licença…

simples assim :slight_smile:
[/quote]

Bom, estamos falando de coisas diferentes. Estou falando de controle de licença, não de chaves de ativação.

entendi, realmente são coisas bem distintas, apesar de no fim fazerem parte da mesma solução…
o meu controle de licença imitado do PS3 da Sony é bem flexivel.

Ao mesmo tempo que se prende a uma maquina especifica ele permite vc trocar de maquina 5 vezes, ou
se quiser compartilhar a licença com amigos, como é feito hoje na PSN :), compartilha em até 5 pessoas.

porem como falei, é uma escolha de quem comprar o software, compartilhar ou guardar pra si as 5 chances que tem de instalar
o mesmo.

o gerenciamento disso tb pode ser automatico, com um servidor e o cliente inteligentes.
se bem feito nem intervenção para que tudo funcione é necessaria.

[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]

da mais trampo valida chave e criar chave do que fazer o sistema!
okakoakoakoakoakoakoakoako

gostei da explicação, preciso fazer isso… porém sou iniciante em java e ainda nao entendo algumas coisas que tem ai!

[]´s

[quote=dyorgio]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 :

[code]
/**
* 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 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.");
	}
}

[/code][/quote]

ai galera sera que neste processo tem como desviar ou evitar as redes do Hamachi ?

ta funcionando legal so que o primeiro endereço que ele encontra é a do Hamachi

Fala ai Bruxel…
Cara, o isVirtual() ali deveria estar barrando a placa do Hamachi,
mas pelo visto ele faz tão bem feito o serviço que burla esse tipo de controle :P,
tente colar aquí pra gente o resultado do seu ipconfig.
Para isso abra um CMD(Console,Terminal) e digite ipconfig + ENTER

nao sei do que pode adiantar mas ta ai

C:>ipconfig

Configuração de IP do Windows

Adaptador Ethernet Conexão local:

Sufixo DNS específico de conexão. . . . . . :
Endereço IPv4. . . . . . . . . . . . . . . . . . . . : 0.0.0.0
Máscara de Sub-rede. . . . . . . . . . . . . . . : 0.0.0.0
Gateway Padrão . . . . . . . . . . . . . . . . . . : 0.0.0.0

Adaptador Ethernet Hamachi:

Sufixo DNS específico de conexão. . . . . . :
Endereço IPv4. . . . . . . . . . . . . . . . . . . . : 0.0.0.0
Máscara de Sub-rede. . . . . . . . . . . . . . . : 0.0.0.0
Gateway Padrão . . . . . . . . . . . . . . . . . . : 0.0.0.0

Bruxel, vc nos enviou um ipconfig sem rede,

Todos os endereços 0.0.0.0 (desconectado)

Mas assim de cara eu faria uma modifiação no if , assim:

antes:

if (!atualInterface.isLoopback() && !atualInterface.isVirtual()  
                    && !atualInterface.isPointToPoint()  
                    && atualInterface.getHardwareAddress() != null) {  

depois

if (!atualInterface.isLoopback() && !atualInterface.isVirtual()  
                    && !atualInterface.isPointToPoint()  
                    && atualInterface.getHardwareAddress() != null
                    && atualInterface.getName().indexOf("Hamachi") == -1 // HACK, POG, GoHorse - Ignora adaptadores Hamachi
) {  

Ficou meia boca, mas acho que da conta do recado.

não funcionou, os adaptadores q ele teria como a descricao Hamachi, tranquilo ele acabou ignorando, mas veio alguns com a descricao net0
net1, e dai acho q um desses passou e o endereco mac q ele retornou foi o do hamachi

Bruxel, conecte-se em alguma rede e certifique-se
que o seu ipconfig liste esses seus dois adaptadores (net0, e net1)
ai cole aqui para a gente.