采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址

采用truelicense进行Java规划license控制

扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址。

Truelicense 它是一个开源java license 检验项目。

使用truelicense实现用于JAVAprojectlicense机制(包含license生成和验证)请參考http://www.it165.net/pro/html/201404/11540.html

当中包含license授权机制的原理和制作license的详细步骤

本文主要是在此文基础上添加了mac 地址验证:

在createparam.properties

中添加 ip地址和 mac 地址的配置

##########common parameters###########
#alias
PRIVATEALIAS=privateKeys
#key(important!)
KEYPWD=iptv1234
#STOREPWD
STOREPWD=iptv1234
#SUBJECT
SUBJECT=bigdata
#licPath
licPath=C:/9exce/license/license.lic
#priPath
priPath=C:/9exce/license/PrivateKeys.keystore
##########license content###########
#issuedTime
issuedTime=2015-03-09
#notBeforeTime
notBefore=2015-03-09
#notAfterTime
notAfter=2016-03-20
#ip address
ipAddress=150.236.220.200
#mac address
macAddress=80-00-0B-56-3B-32
#consumerType
consumerType=user
#ConsumerAmount
consumerAmount=1
#info
info=this is a license

由于添加了mac地址,须要改变LicenseManager中的validate函数添加create_validate 用于create时的verify, 由于创建证书的时候 不能验证mac地址。

	protected synchronized void create_validate(LicenseContent paramLicenseContent)
			throws LicenseContentException {
		LicenseParam localLicenseParam = getLicenseParam();
		if (!localLicenseParam.getSubject().equals(
				paramLicenseContent.getSubject())) {
			throw new LicenseContentException(EXC_INVALID_SUBJECT);
		}
		if (paramLicenseContent.getHolder() == null) {
			throw new LicenseContentException(EXC_HOLDER_IS_NULL);
		}
		if (paramLicenseContent.getIssuer() == null) {
			throw new LicenseContentException(EXC_ISSUER_IS_NULL);
		}
		if (paramLicenseContent.getIssued() == null) {
			throw new LicenseContentException(EXC_ISSUED_IS_NULL);
		}
		Date localDate1 = new Date();
		Date localDate2 = paramLicenseContent.getNotBefore();
		if ((localDate2 != null) && (localDate1.before(localDate2))) {
			throw new LicenseContentException(EXC_LICENSE_IS_NOT_YET_VALID);
		}
		Date localDate3 = paramLicenseContent.getNotAfter();
		if ((localDate3 != null) && (localDate1.after(localDate3))) {
			throw new LicenseContentException(EXC_LICENSE_HAS_EXPIRED);
		}	

		String str = paramLicenseContent.getConsumerType();
		if (str == null) {
			throw new LicenseContentException(EXC_CONSUMER_TYPE_IS_NULL);
		}
		Preferences localPreferences = localLicenseParam.getPreferences();
		if ((localPreferences != null) && (localPreferences.isUserNode())) {
			if (!USER.equalsIgnoreCase(str)) {
				throw new LicenseContentException(EXC_CONSUMER_TYPE_IS_NOT_USER);
			}
			if (paramLicenseContent.getConsumerAmount() != 1) {
				throw new LicenseContentException(
						EXC_CONSUMER_AMOUNT_IS_NOT_ONE);
			}
		} else if (paramLicenseContent.getConsumerAmount() <= 0) {
			throw new LicenseContentException(
					EXC_CONSUMER_AMOUNT_IS_NOT_POSITIVE);
		}
	}

更新validate添加验证客户server的mac地址。

protected synchronized void validate(LicenseContent paramLicenseContent)
			throws LicenseContentException {
		LicenseParam localLicenseParam = getLicenseParam();
		if (!localLicenseParam.getSubject().equals(
				paramLicenseContent.getSubject())) {
			throw new LicenseContentException(EXC_INVALID_SUBJECT);
		}
		if (paramLicenseContent.getHolder() == null) {
			throw new LicenseContentException(EXC_HOLDER_IS_NULL);
		}
		if (paramLicenseContent.getIssuer() == null) {
			throw new LicenseContentException(EXC_ISSUER_IS_NULL);
		}
		if (paramLicenseContent.getIssued() == null) {
			throw new LicenseContentException(EXC_ISSUED_IS_NULL);
		}
		Date localDate1 = new Date();
		Date localDate2 = paramLicenseContent.getNotBefore();
		if ((localDate2 != null) && (localDate1.before(localDate2))) {
			throw new LicenseContentException(EXC_LICENSE_IS_NOT_YET_VALID);
		}
		Date localDate3 = paramLicenseContent.getNotAfter();
		if ((localDate3 != null) && (localDate1.after(localDate3))) {
			throw new LicenseContentException(EXC_LICENSE_HAS_EXPIRED);
		}

		LicenseCheckModel licenseCheckModel = (LicenseCheckModel)paramLicenseContent.getExtra();
		String macAddress = licenseCheckModel.getIpMacAddress();

		try {
			if (!ListNets.validateMacAddress(macAddress)) {
				throw new LicenseContentException(EXC_LICENSE_HAS_EXPIRED);
			}
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			throw new LicenseContentException(EXC_LICENSE_HAS_EXPIRED);
		}

		String str = paramLicenseContent.getConsumerType();
		if (str == null) {
			throw new LicenseContentException(EXC_CONSUMER_TYPE_IS_NULL);
		}
		Preferences localPreferences = localLicenseParam.getPreferences();
		if ((localPreferences != null) && (localPreferences.isUserNode())) {
			if (!USER.equalsIgnoreCase(str)) {
				throw new LicenseContentException(EXC_CONSUMER_TYPE_IS_NOT_USER);
			}
			if (paramLicenseContent.getConsumerAmount() != 1) {
				throw new LicenseContentException(
						EXC_CONSUMER_AMOUNT_IS_NOT_ONE);
			}
		} else if (paramLicenseContent.getConsumerAmount() <= 0) {
			throw new LicenseContentException(
					EXC_CONSUMER_AMOUNT_IS_NOT_POSITIVE);
		}
	}

创建类ListNets 用于读取客户server的IP地址和mac地址进行验证。笔者使用了验证mac地址的函数。毕竟客户有可能更改机器的ip地址的

package zlicense.util;

import java.net.*;
import java.util.*;

import static java.lang.System.out;

public class ListNets {

	public static void main(String args[]) throws SocketException {
		String ip = "150.236.220.200";
		String mac = "80-00-0B-56-3B-32";
		boolean flag = validatoIpAndMacAddress(ip, mac);
		boolean macflag = validateMacAddress( mac);
		out.printf("validatoMacAddress flag=%s\n", macflag);
		out.printf("validatoIpAndMacAddress flag=%s\n", flag);
	}

	static void displayInterfaceInformation(NetworkInterface netint)
			throws SocketException {
		out.printf("Display name: %s\n", netint.getDisplayName());
		out.printf("Name: %s\n", netint.getName());
		byte[] mac = netint.getHardwareAddress();
		if (mac != null) {
			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < mac.length; i++) {
				sb.append(String.format("%02X%s", mac[i],
						(i < mac.length - 1) ?

"-" : ""));
			}
			System.out.println("mac=" + sb.toString());
		}

		Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
		for (InetAddress inetAddress : Collections.list(inetAddresses)) {
			out.printf("InetAddress: %s\n", inetAddress);
			System.out
					.println("InetAddress ip=" + inetAddress.getHostAddress());
		}
		out.printf("\n");
	}

	public static boolean validateMacAddress(String macAddress)
			throws SocketException {
		boolean returnFlag = false;
		Enumeration<NetworkInterface> nets = NetworkInterface
				.getNetworkInterfaces();
		for (NetworkInterface netint : Collections.list(nets)) {
			byte[] mac = netint.getHardwareAddress();
			StringBuilder sb = new StringBuilder();
			if (mac != null) {
				for (int i = 0; i < mac.length; i++) {
					sb.append(String.format("%02X%s", mac[i],
							(i < mac.length - 1) ?

"-" : ""));
				}
				System.out.println("mac=" + sb.toString());
			}
			if (sb.toString().equals(macAddress)) {
				returnFlag = true;
			}
		}
		return returnFlag;

	}

	public static boolean validatoIpAndMacAddress(String ipAddress,
			String macAddress) throws SocketException {
		boolean returnFlag = false;
		Enumeration<NetworkInterface> nets = NetworkInterface
				.getNetworkInterfaces();
		for (NetworkInterface netint : Collections.list(nets)) {
			byte[] mac = netint.getHardwareAddress();
			StringBuilder sb = new StringBuilder();
			if (mac != null) {
				for (int i = 0; i < mac.length; i++) {
					sb.append(String.format("%02X%s", mac[i],
							(i < mac.length - 1) ?

"-" : ""));
				}
				System.out.println("mac=" + sb.toString());
			}
			if (sb.toString().equals(macAddress)) {
				Enumeration<InetAddress> inetAddresses = netint
						.getInetAddresses();
				String ip = "";
				for (InetAddress inetAddress : Collections.list(inetAddresses)) {
					ip = inetAddress.getHostAddress();
					System.out.println("InetAddress ip="
							+ inetAddress.getHostAddress());
					if (ipAddress.toString().equals(ip)) {
						returnFlag = true;
					}
				}
			}
		}
		return returnFlag;

	}
}

创建LicenseCheckModel 是一个model类就是存储 ip和mac地址

package zlicense.util;

public class LicenseCheckModel {

	private String ipAddress;
	private String ipMacAddress;
	private String CPUSerial;
	private String motherboardSN;
	private String hardDiskSN;

	public String getIpAddress() {
		return ipAddress;
	}
	public void setIpAddress(String ipAddress) {
		this.ipAddress = ipAddress;
	}
	public String getIpMacAddress() {
		return ipMacAddress;
	}
	public void setIpMacAddress(String ipMacAddress) {
		this.ipMacAddress = ipMacAddress;
	}
	public String getCPUSerial() {
		return CPUSerial;
	}
	public void setCPUSerial(String cPUSerial) {
		CPUSerial = cPUSerial;
	}
	public String getMotherboardSN() {
		return motherboardSN;
	}
	public void setMotherboardSN(String motherboardSN) {
		this.motherboardSN = motherboardSN;
	}
	public String getHardDiskSN() {
		return hardDiskSN;
	}
	public void setHardDiskSN(String hardDiskSN) {
		this.hardDiskSN = hardDiskSN;
	}

}

更新CreateLicense 添加mac和ip 的配置读取并写入license证书。採用了content.setExtra(licenseCheckModel);

将须要验证的信息 写入licenseCheckModel 然后set到content中。

改变了 truelicense 中全部的文件读取方式。採用绝对路径读取。

   Properties prop= new Properties();
                   //InputStream in= getClass().getResourceAsStream(propertiesPath);

                   try {
                            InputStreamin = new FileInputStream(propertiesPath);
                            prop.load(in);
                   } catch(IOException e) {
                            // TODOAuto-generated catch block
                            e.printStackTrace();
                   }

全部的配置文件和我生成的 key stroe 在java-license-jar/src/main/resources目录下

项目code地址:

https://github.com/jingshauizh/JavaSpringSurmmary/tree/master/java-license-jar

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-03 22:55:19

采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址的相关文章

使用truelicense进行Java程序license控制 经过扩张可以验证license 开始结束日期,验证绑定给定mac地址

使用truelicense进行Java程序license控制 经过扩张可以验证license 开始结束日期,验证绑定给定mac地址. Truelicense 是一个开源的java license 验证项目. 使用truelicense实现用于JAVA工程license机制(包括license生成和验证)请参考http://www.it165.net/pro/html/201404/11540.html 其中包括license授权机制的原理和制作license的具体步骤 本文主要是在此文基础上增加

[Android] [Java] Process 创建+控制+分析 经验浅谈

无论是Android亦或者Java中或多或少需要调用底层的一些命令,执行一些参数: 此时我们需要用到Java的Process来创建一个子进程,之所以是子进程是因为此进程依赖于发起创建请求的进程,如果发起者被Kill那个子进程也将Kill. 对于Process相信使用过的朋友一定不会陌生,它具有如下特点: 1.创建简单 2.控制难 3.容易导致无法创建子进程 4.如果是多线程那么很有可能造成内存溢出 以上现象如果你只是偶尔使用一次,创建一个进程或许你什么都没有感觉到,但是如果你使用了多线程,进行了

Java安全套接字扩展——JSSE

上节已经介绍了SSL/TLS协议的通信模式,而对于这些底层协议,如果要每个开发者都自己去实现显然会带来不必要的麻烦,正是为了解决这个问题Java为广大开发者提供了Java安全套接字扩展--JSSE,它包含了实现Internet安全通信的一系列包的集合,是SSL和TLS的纯Java实现,同时它是一个开放的标准,每个公司都可以自己实现JSSE,通过它可以透明地提供数据加密.服务器认证.信息完整性等功能,就像使用普通的套接字一样使用安全套接字,大大减轻了开发者的负担,使开发者可以很轻松将SSL协议整合

1.30 Java周末总结①控制显示多少位小数位②读txt和写txt模拟ATM数据库

1.30 Java周末总结①控制显示多少位小数位②读txt和写txt模拟ATM数据库 一.控制显示多少位小数位 有些时候小数位数太多了,想保留多少位小数,这里介绍一种利用四舍五入保留想要的小数位数Math.round四舍五入到整数位,所以把小数乘以整10或整百,在除以整10或整百,就得到想要的位数了 double a = 3.14159265359;double weishu = 5;double b = Math.pow(10,weishu);a = Math.round(a*b)/b; 二.

黑马程序员——Java基础---流程控制

一.概述 Java提供了两种基本的流程控制结构:分支结构和循环结构.其中分支结构用于是根据条件来选择执行某段代码,循环结构则是根据循环条件重复执行某段代码.分支语句有if和switch两种,循环语句有for.while和do while三种.除此之外,jdk1.5还提供了foreach循环,同时java还提供了break和continue来控制程序的循环结构. 一.正文 1.顺序结构 这是程序最常见的结构,如果没有流程控制,java就会从上到下一次执行每条语句,这个没什么可说的. 2.分支结构

Java 访问权限控制:你真的了解 protected 关键字吗?

摘要: 在一个类的内部,其成员(包括成员变量和成员方法)能否被其他类所访问,取决于该成员的修饰词:而一个类能否被其他类所访问,取决于该类的修饰词.Java的类成员访问权限修饰词有四类:private,无(默认情况下,包访问权限),protected 和 public,而其中只有包访问权限和public才能修饰一个类(内部类除外).特别地,很多的介绍Java的书籍对protected介绍的比较笼统,常常会对大家造成误解.因此,本文重点揭示了 protected 关键字的内涵和用法,并介绍了一些其他

java通过继承来扩展接口

接口主要是为了向上转型,从而使基类(接口方法)更具灵活性!不想废话,看例子: /** * */ package interfaces; interface Monster{ void menace(); } interface DangerousMonster extends Monster{ void destory(); } interface Lethal{ void kill(); } class DragonZilla implements DangerousMonster{ publ

Java访问权限控制小结

进行访问权限控制的两个原因 第一,可以控制类成员的可见性,使客户程序员只看到应该看到的内容 第二,可以使类的创建者随意改变类内部的工作方式,而不必担心会对客户端程序产生重大影响 四种访问权限 pulic 默认(包权限) protected private 用于域和方法 public表示所有人对本成员都可以访问 默认访问权限表示同一包下的类可以对本成员进行访问,其他包中的则不可以(!默认包) protected用于类的继承中,protected提供包访问权限,同时,子类也对protected成员具

方法级别的java日志输出控制(二)集群

在方法级别的java日志输出控制(一)这篇文章中主要讨论了通过properties配置文件以及AOP技术批量控制方法级别的日志输出. 用properties配置文件的好处是不用更改程序即可控制日志的输出,然而大型的应用通常是分布式的,会有很多的服务器,需要更改全部服务器上的配置文件,然后再重启应用.这将会是一件非常麻烦的事情.事实上在大型集群应用中有更好的方法实现他.zookeeper的特性决定着它有一个应用场景就是集群配置中心.本文不介绍zookeeper原理以及搭建,将直接使用zookeep