truelicense 添加mac验证说明及demo下载
来源:互联网 发布:ubuntu配置samba服务器 编辑:程序博客网 时间:2024/06/15 20:44
truelicense相关原理可以参考第一篇:http://blog.csdn.net/luckymelina/article/details/22870665
本文参考第二篇:http://blog.csdn.net/jingshuaizh/article/details/44461289
第一篇能够让刚接触truelicense的童鞋很成功的上手并测试成功,由于项目需要mac验证,所以参考第二篇,介于发现有些网友反应有错误,本人也遇到错误,后贴上成功运行的工程仅供参考。
添加mac验证功能需要修改truelicense源码,可以参考第二篇的git地址下载源码:https://github.com/jingshauizh/JavaSpringSurmmary/tree/master/java-license-jar
添加mac验证的原理是添加mac信息到license context 并生成license文件,然后在验证程序中加入mac验证算法,验证时读取license文件中的mac信息,然后验证~
接下来是本例制作license的具体步骤:
使用keytool生成密钥对
以下命令在dos命令行执行,注意当前执行目录,最后生成的密钥对即在该目录下:
1、首先要用KeyTool工具来生成私匙库:(-alias别名 –validity 3650表示10年有效)
keytool -genkey -alias privatekey -keystore privateKeys.store -validity 3650
2、然后把私匙库内的公匙导出到一个文件当中:
keytool -export -alias privatekey -file certfile.cer -keystore privateKeys.store
3、然后再把这个证书文件导入到公匙库:
keytool -import -alias publiccert -file certfile.cer -keystore publicCerts.store
最后生成文件privateKeys.store、publicCerts.store拷贝出来备用。
以上是在windows机器上的预备动作。
接下来开始修改程序:
1、修改生成licence代码。
生成license程序中 createparam.properties:
##########common parameters############aliasPRIVATEALIAS=privatekey#key(该密码生成密钥对的密码,需要妥善保管,不能让使用者知道) KEYPWD=bigdata123456#STOREPWD(该密码是在使用keytool生成密钥对时设置的密钥库的访问密码)STOREPWD=abc123456#SUBJECTSUBJECT=bigdata#licPathlicPath=bigdata.lic#priPathpriPath=privateKeys.store##########license content############issuedTimeissuedTime=2017-05-01#notBeforeTimenotBefore=2017-05-01#notAfterTimenotAfter=2017-06-10#consumerTypeconsumerType=user#ConsumerAmountconsumerAmount=1#infoinfo=this is a license#macmac=D8-CB-8A-04-51-10
然后通过content.setExtra()方法添加mac信息到license content,这是主要生成license的代码CreateLicense.java:
//license content issuedTime = prop.getProperty("issuedTime"); notBefore = prop.getProperty("notBefore"); notAfter = prop.getProperty("notAfter"); consumerType = prop.getProperty("consumerType"); consumerAmount = Integer.valueOf(prop.getProperty("consumerAmount")); info = prop.getProperty("info"); mac = prop.getProperty("mac"); ip = prop.getProperty("ip");
content.setConsumerType(consumerType); content.setConsumerAmount(consumerAmount); content.setInfo(info); // 扩展 //content.setExtra(new Object()); content.setExtra(mac);
这里的setExtra可以传入一个object,如果除了mac地址还需要其他验证,可以传入一个model类,这里只传入一个mac String字符串。
以上修改即可完成licence文件生成。
2、修改验证licence代码
验证时使用到的Properties文件如下:
##########common parameters############aliasPUBLICALIAS=publiccert#STOREPWDSTOREPWD=abc123456#SUBJECTSUBJECT=bigdata#licPathlicPath=D:\\tmp\\bigdata.lic#pubPathpubPath=D:\\tmp\\publicCerts.store
接下来修改LicenseManager.java源码中的validate方法,主要是从licence中读取mac值并使用算法进行验证。
String macAddress = paramLicenseContent.getExtra().toString(); 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); }
ListNets类如下:
package zlicense.de.schlichtherle.utils;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 = "192.168.3.212"; String mac = "D8-CB-8A-04-51-10"; 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; }}
这里只用到了其中一个验证mac的算法,如果有其他需求,可以在这里添加验证。
最后是生成和验证程序的入口(不需要修改,只执行):
public class licenseCreateTest { public static void main(String[] args){ CreateLicense cLicense = new CreateLicense(); //获取参数 cLicense.setParam("./param.properties"); //生成证书 cLicense.create(); }}
public class licenseVerifyTest { public static void main(String[] args){ VerifyLicense vLicense = new VerifyLicense(); //获取参数 vLicense.setParam("D:\\tmp\\param.properties"); //生成证书 vLicense.verify(); }}
到这里代码修改完毕。有一个需要注意的问题:生成和验证licence的工程包名需要一致,否则会报强转错误。
以上逻辑搞清楚后,完全可以自己测试了。这里放上我的测试工程,仅供参考:
http://download.csdn.net/download/qq_27499099/9838931
- truelicense 添加mac验证说明及demo下载
- truelicense简要说明
- 使用truelicense进行Java程序license控制 经过扩张可以验证license 开始结束日期,验证绑定给定mac地址
- 使用truelicense进行Java程序license控制 经过扩张可以验证license 开始结束日期,验证绑定给定mac地址
- spring boot运行在jdk1.6、tomcat6的说明及demo下载
- Cornerstone 3.0.1 for Mac 破解版 下载及 安装说明
- JustPrint的完整DEMO及说明
- opencv2下载及安装说明
- zookeeper的下载使用及简单demo
- SHGetAutoRunPath的说明及用法(未验证)
- 使用truelicense实现用于JAVA工程license机制(包括license生成和验证)
- 使用truelicense实现用于JAVA工程license机制(包括license生成和验证)
- 使用truelicense实现用于JAVA工程license机制(包括license生成和验证)
- 使用truelicense实现用于JAVA工程license机制(包括license生成和验证)
- UI013---ImageView添加控件及tag说明
- Mac添加环境变量及Homebrew的安装
- Fedora Redhat 下载资源及相关说明
- MT4.0版下载及相关说明
- SQL学习
- 码农技术炒股之路——配置管理器、日志管理器
- java实现输入一个链表,反转链表后,输出链表的所有元素。
- JavaScript代码运行分为几个阶段
- Transition 总结
- truelicense 添加mac验证说明及demo下载
- @Resource和@Autowired的区别
- Ugly Numbers UVA
- 简单跳跃表的实现
- 20170510 HTTPS加密原理/流的概念/URL的组成/NAT的概念
- caffe编译调用cuda_8.0,却提示找不到cuda_7.0的库
- Jquery easyUI 获得 datebox 日期
- A summary: how to use bit manipulation to solve problems easily and efficiently
- React顶级API