仿某系统许可生成
许可文件
本文简单的实现了许可生成,只能一台计算机生成一个许可文件,许可文件包含了申请的时间参数,过期时间有一个月,三个月,一年和终身使用。
首先用户通过申请填写需要使用许可的计算机名称和需要申请的许可使用时间。
然后申请的lic文件会保存在F盘的test文件下,可修改为配置文件。
下来我们看一下源码:
目录结构
用户进行许可申请
通过MD5加盐汉字转化为16进制处理,计算申请的过期时间通过AES加密处理
package com.herbert.lic.test; import com.herbert.lic.common.AESUtil; import com.herbert.lic.common.MD5Util; import com.herbert.lic.common.UnicodeUtil; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.util.Calendar; import java.util.Date; /** * 用户进行申请许可 */ public class UserNeedLic { public static void main(String[] args) throws IOException { /** * 用户输入自己计算机名称 * 选择使用许可的时间(时间有1个月,3个月,一年,终身)。 * 许可 一个月 -> 1,3个月 -> 3 ,一年 -> 4,终身 -> 5 */ /*用户输入自己计算机名称*/ String computerName = "R-COMPUTER"; /*许可的使用时间*/ String timeLic = "1"; crateLic(computerName,timeLic); } public static String crateLic(String computerName, String timeLic) throws IOException { //盐 String salt = "摘星族"; //将汉字转换为16进制的数 String salt16 = UnicodeUtil.enUnicode(salt); String computerLic = MD5Util.getMd5(computerName + salt16).replace("-", "*").toUpperCase(); long timeEnd = 0; Calendar calendar = Calendar.getInstance(); Date date = new Date(System.currentTimeMillis()); calendar.setTime(date); switch (timeLic) { case "1": /** * 一个月的许可 按30天计算 */ calendar.add(Calendar.MONTH, 1); timeEnd = calendar.getTimeInMillis(); break; case "3": /** * 三个月的许可 按90天计算 */ calendar.add(Calendar.MONTH, 3); timeEnd = calendar.getTimeInMillis(); break; case "4": /** * 一年的许可 */ calendar.add(Calendar.YEAR, +1); timeEnd = calendar.getTimeInMillis(); break; case "5": /** * 终身的许可 */ timeEnd = 100000; break; } if(timeEnd == 0){ return "请选择许可使用时间"; } //生成的密文 写到许可文件中即可 String lic =computerLic+"-"+(AESUtil.AESEncode(timeEnd+"".trim()).replace("-","*")); System.out.println("许可密文 ==>>>>> "+lic); FileUtils.write(new File("F:/test/herbert.lic"), lic, "utf-8", false); System.out.println("lic文件已存放至 ==>>>>> F:/test/herbert.lic"); return lic; } }
运行结果
许可密文 ==>>>>> 5EDC55412916FC3572920375523A992A-FVM8ArP6g2XI8s8W68N/zg==
lic文件已存放至 ==>>>>> F:/test/herbert.lic
F盘符下的文件
用户检测是否存在许可
许可文件
本文简单的实现了许可生成,只能一台计算机生成一个许可文件,许可文件包含了申请的时间参数,过期时间有一个月,三个月,一年和终身使用。
首先用户通过申请填写需要使用许可的计算机名称和需要申请的许可使用时间。
然后申请的lic文件会保存在F盘的test文件下,可修改为配置文件。
下来我们看一下源码:
目录结构
用户进行许可申请
通过MD5加盐汉字转化为16进制处理,计算申请的过期时间通过AES加密处理
package com.herbert.lic.test; import com.herbert.lic.common.AESUtil; import com.herbert.lic.common.MD5Util; import com.herbert.lic.common.UnicodeUtil; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.util.Calendar; import java.util.Date; /** * 用户进行申请许可 */ public class UserNeedLic { public static void main(String[] args) throws IOException { /** * 用户输入自己计算机名称 * 选择使用许可的时间(时间有1个月,3个月,一年,终身)。 * 许可 一个月 -> 1,3个月 -> 3 ,一年 -> 4,终身 -> 5 */ /*用户输入自己计算机名称*/ String computerName = "R-COMPUTER"; /*许可的使用时间*/ String timeLic = "1"; crateLic(computerName,timeLic); } public static String crateLic(String computerName, String timeLic) throws IOException { //盐 String salt = "摘星族"; //将汉字转换为16进制的数 String salt16 = UnicodeUtil.enUnicode(salt); String computerLic = MD5Util.getMd5(computerName + salt16).replace("-", "*").toUpperCase(); long timeEnd = 0; Calendar calendar = Calendar.getInstance(); Date date = new Date(System.currentTimeMillis()); calendar.setTime(date); switch (timeLic) { case "1": /** * 一个月的许可 按30天计算 */ calendar.add(Calendar.MONTH, 1); timeEnd = calendar.getTimeInMillis(); break; case "3": /** * 三个月的许可 按90天计算 */ calendar.add(Calendar.MONTH, 3); timeEnd = calendar.getTimeInMillis(); break; case "4": /** * 一年的许可 */ calendar.add(Calendar.YEAR, +1); timeEnd = calendar.getTimeInMillis(); break; case "5": /** * 终身的许可 */ timeEnd = 100000; break; } if(timeEnd == 0){ return "请选择许可使用时间"; } //生成的密文 写到许可文件中即可 String lic =computerLic+"-"+(AESUtil.AESEncode(timeEnd+"".trim()).replace("-","*")); System.out.println("许可密文 ==>>>>> "+lic); FileUtils.write(new File("F:/test/herbert.lic"), lic, "utf-8", false); System.out.println("lic文件已存放至 ==>>>>> F:/test/herbert.lic"); return lic; } }
运行结果
许可密文 ==>>>>> 5EDC55412916FC3572920375523A992A-FVM8ArP6g2XI8s8W68N/zg==
lic文件已存放至 ==>>>>> F:/test/herbert.lic
F盘符下的文件
用户检测是否存在许可
package com.herbert.lic.test; import com.herbert.lic.common.AESUtil; import com.herbert.lic.common.MD5Util; import com.herbert.lic.common.UnicodeUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; import java.net.InetAddress; import java.net.UnknownHostException; /** * 用户进行许可的检测 */ public class UserTestLic { public static void main(String[] args) throws UnknownHostException { /** * 用户输入自己计算机名称,输入自己需要用的产品。 * 选择使用许可的时间(时间有1个月,3个月,一年,终身)。 */ System.out.println(testLic()); } public static String testLic() throws UnknownHostException { String licStr =readFileLic("F:/test/herbert.lic"); if(StringUtils.isBlank(licStr) || !licStr.contains("-")){ return "没有许可"; } String[] lics =licStr.split("-"); /** * 获取本地计算机名称 */ InetAddress addr = InetAddress.getLocalHost(); String hostName =addr.getHostName(); //盐 String salt = "摘星族"; //将汉字转换为16进制的数 String salt16 = UnicodeUtil.enUnicode(salt); String computerLic = MD5Util.getMd5(hostName + salt16).replace("-", "*").toUpperCase(); if(!computerLic.equals(lics[0])){ return "请去申请许可"; } String timeLic =AESUtil.AESDecode(licStr.split("-")[1]); if(Long.valueOf(timeLic)==100000){ return "许可正常"; } if(System.currentTimeMillis()>Long.valueOf(timeLic)){ return "许可过期"; } return "许可正常"; } /** * 读取文件 * @param pathName * @return */ public static String readFileLic(String pathName) { BufferedReader bReader = null; StringBuilder stringBuilder = null; try { //需要读取的文件 File file = new File(pathName); //建立一个输入流对象 FileInputStream fileInputStream = new FileInputStream(file); bReader = new BufferedReader(new InputStreamReader(fileInputStream, "UTF-8")); stringBuilder = new StringBuilder(); String line = ""; while ((line = bReader.readLine()) != null) { stringBuilder.append(line); } bReader.close(); return stringBuilder.toString(); } catch (Exception e) { System.out.println("读取文件失败"); e.printStackTrace(); } finally { try { if(bReader != null){ bReader.close(); } } catch (IOException e) { e.printStackTrace(); } } return stringBuilder.toString(); } }
运行结果
许可正常
-- 由于版本有限,所有代码传入码云中,点击阅读全文可进入码云。
运行结果
许可正常
-- 由于版本有限,所有代码传入码云中,点击阅读全文可进入码云。