LICENSE授权

合集下载

LICENSE授权操作指引[优质ppt]

LICENSE授权操作指引[优质ppt]
JSST
员工信息注册
第一次申请使用授权机时,需要先注册用户, 如已注册绑定,此步可省略 首先,读需要注册绑定的授权机的CPUID号
JSST JSST
员工信息注册
主要是注册在职人员信息并绑定所使用的授 权机,一个员工号只能绑定一个授权机,如果 该员工绑定的授权机有故障,只需要绑定另一 个授权机即可,之前绑定的授权机自动解绑。 在外网输入: http://121.34.253.103:9080/portal/ 确认后,输 入授权机的CPUID号,点击提交,系统会自动 反馈一个注册码。
JSST License授权操作指引
为人类创造捷*顺环境
主要内容
1、系统介绍 2、名词解析 3、LICENSE调试指引 4、LICENSE授权、密钥系统管理 4、常见问题处理
JSST
系统介绍
JSST License授权和密钥系统主要作用是替代公司现使用的软件加密狗和硬件加密狗,实现通过License软件 授权确定软件版本、密钥系统绑定主板唯一DNA号码,从而提高公司软硬件的安全等级。
授权文件
导入授权文件 打开安装目录c:\program files\G3\license授权服务\导入授权文件,把申请到的授权文件通过“导入授权文件”导入
IMC
授权文件申请
导入授权文件界面
JSST IMC
授权文件申请
网络认证机调试 硬件初始化: 1、系统安全服务机上电,并通过网线连接工作电脑; 2、如工作、通讯、异常、认证四个指示灯闪亮并伴有蜂鸣器 报警,则网络认证服务器已初始化(IP 地址为192.168.0.1),可直接使用电脑进行IP 地址设置。如 未初始化,则长按恢复出厂值按键。 3、登录 web 页面(IE 浏览器),输入192.168.0.1 并按回车 键,显示网络认证服务器IP 地址设置界; 根据现场网络配置输入IP地址,点击“Init”键,网络认证服 务器IP地址设置完成; 5、使用 ping工作,测试网络认证服务器P 地址是否连接正常, 网络认证服务器设置完成。

01-02 License简介

01-02 License简介

2 License简介定义License:许可证,是供应商与客户对所销售/购买的产品(这里特指软件版本)使用范围、期限等进行授权/被授权的一种合约形式,通过License,客户获得供应商所承诺的相应服务。

物理形式表现为License授权证书和License文件。

目的用户购买设备后,可以使用设备的基本功能。

当用户因业务拓展,需要使用增值特性或者对设备资源进行扩容时,可以购买设备对应功能或资源的License,以满足业务的需求。

通过License的控制,可以有效降低用户的成本。

用户根据实际需要,灵活的选择License,即可获得定制的功能。

License分类●License根据用途可以分为两种类型,商用类型(COMM)和非商用类型(DEMO)。

–商用类型正常情况下,依据合同规定购买的License,大部分License其期限一般为永久有效,部分License有固定期限限制。

用户购买的License都应属于商用类型。

–非商用类型用于测试、试用等特殊用途的临时License,有着严格的期限限制。

●License根据授权的内容可以分为功能型License和资源型License。

–功能型License功能型License控制用户对设备某项功能的使用,用户想要使用某受限功能,需要首先获得该功能的授权。

–资源型License资源型License控制用户对资源项数目的使用,用户想要使用对应资源项,需要首先获得该资源项的授权。

用户根据实际业务需要,可以不选择资源型License,使用产品默认支持的资源;也可以选择购买一个或者多个资源型License,同一个资源型License支持多次选择,用户可以任意组合,最终获得的资源数目为所有资源型License的资源之和。

说明用户选择资源型License时,需要注意资源总数不能超过产品支持的最大资源数目。

请联系华为办事处,获取产品支持的最大资源数目信息。

License特点License具有便利、安全和容灾的特点,为用户提供优质的服务。

关于网站javalicense单机授权认证的见解

关于网站javalicense单机授权认证的见解

关于⽹站javalicense单机授权认证的见解 在给客户公司开发⽹站往往需要进⾏⼀个授权认证机制防⽌知识产权被侵犯。

我就讲讲在最近⼀个项⽬中⽤到的授权机制,⼀直想整理⼀下做个总结但都没有⼀个合适的时间段,今天我就详细说说我怎么实现的欢迎⼤家指正漏洞哦。

⼀、背景:单机实现认证过程,也就是通过读取⼀个⽂件(xxx.lic)来判断是否认证过。

产品类似桌⾯应⽤需要安装包,客户要想使⽤该产品装完产品后第⼀次打开时是需要完成⼀个授权认证的(需要读取上⾯说的xxx.lic⽂件)。

该⽂件的产⽣是由开发者公司提供,可设置使⽤期限。

⼆、所⽤到的技术:RSA⾮对称加密和MD5算法。

三、说明:RSA算法只⽤到其中的数字签名为了防⽌⽂件被恶意篡改,主要的认证信息还是⽤到的MD5加密。

因为是单机授权没有必要使⽤RSA的加密算法,只是为了保证⼀个授权⽂件只能在⼀台电脑上使⽤⼀个MD5就够了(MD5中也可以加⼊⾃⼰的算法)。

主要是获取电脑的cpu序列号,mac 地址硬盘序列号等信息作为唯⼀标识进⾏认证可设置授权的开始时间和结束时间来验证是否过期。

下⾯直接上代码吧,欢迎指正。

1、⾸先是加密解密类 RSATester.javaimport java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Map;import java.util.Properties;import com.alibaba.fastjson.JSONObject;/*** @className: RSATester* @description: RSA 加密解密类* @author: yjb* @createTime: 2017-12-01 下午10:03:44*/public class RSATester {static String publicKey;static String privateKey;static {try {Map<String, Object> keyMap = RSAUtils.genKeyPair();publicKey = RSAUtils.getPublicKey(keyMap);privateKey = RSAUtils.getPrivateKey(keyMap);} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) throws Exception {test();// licenseCheck();// getConfig("");}/*** 公钥加密——私钥解密** @throws Exception*/static void test() throws Exception {System.err.println("公钥加密——私钥解密");Date endtime = null;String str1 = "";String str2 = "";String str22 = "";String str2type = "";String str3 = "";Boolean status = true;// 明⽂SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");while (true) {System.out.println("请输⼊授权类型 1 or 2 : 1、客户端 2、服务端");str3 = SystemTool.ReadTest();if ("1".equals(str3) || "2".equals(str3)) {break;} else {System.out.println("您输⼊的授权类型有误,请重新输⼊");continue;}}// System.out.println("请输⼊授权过期⽇期:格式如:2017-12-01 12:30:30");while (status) {System.out.println("请选择授权过期⽇期:1、⼀个⽉ 2、三个⽉ 3、六个⽉ 4、⼀年 5、三年 6、⾃定义⽇期"); str2type = SystemTool.ReadTest();str1 = df.format(new Date());if ("1".equals(str2type)) {endtime = SystemTool.getSomeDay(new Date(), 30);break;} else if ("2".equals(str2type)) {endtime = SystemTool.getSomeDay(new Date(), 90);break;} else if ("3".equals(str2type)) {endtime = SystemTool.getSomeDay(new Date(), 180);break;} else if ("4".equals(str2type)) {endtime = SystemTool.getSomeDay(new Date(), 365);break;} else if ("5".equals(str2type)) {endtime = SystemTool.getSomeDay(new Date(), 1095);break;} else if ("6".equals(str2type)) {System.out.println("请输⼊⾃定义⽇期格式如:2017-12-01 12:30:30");str22 = SystemTool.ReadTest();break;} else {System.out.println("您输⼊的授权过期⽇期类型有误,请重新出⼊");continue;}}if ("6".equals(str2type)) {str2 = str22;} else {str2 = df.format(endtime);}// String machineCode=SystemTool.getMachineCode();//MD5加密的机器码System.out.println("请输⼊机器码:");String machineCode = SystemTool.ReadTest();JSONObject localJSONObject = new JSONObject();localJSONObject.put("starttime", str1);localJSONObject.put("endtime", str2);localJSONObject.put("lictype", str3);localJSONObject.put("machinecode", machineCode);String source = localJSONObject.toString();System.out.println("\r加密前⽂字:\r\n" + source);byte[] data = source.getBytes();// byte[] encodedData = RSAUtils.encryptByPublicKey(data, publicKey);byte[] encodedData = RSAUtils.encryptByPrivateKey(data, privateKey);String encodedDatastr = bytesToString(encodedData);// System.out.println("加密后⽂字:\r\n" + new String(encodedData));// System.out.println("加密后经转换格式后的数据:\r\n" + encodedDatastr);// 签名// System.err.println("私钥签名——公钥验证签名");String sign = RSAUtils.sign(encodedData, privateKey);// System.err.println("签名:\r" + sign);// 写⼊本地的内容签名 + 加密后的密⽂String content = publicKey+ "$$" + sign + encodedDatastr;// ⽣成认证⽂件String path = SystemTool.getProjectPath();File localFile2 = new File(path + "\\xxx.lic");if (localFile2.exists())localFile2.delete();PrintWriter localPrintWriter2 = new PrintWriter(new OutputStreamWriter(new FileOutputStream(localFile2)), true); localPrintWriter2.println(content);localPrintWriter2.close();System.out.println("xxx.lic ⽣成成功!⽬录:" + path);}public static String bytesToString(byte[] arr) {StringBuffer sb = new StringBuffer();for (int i = 0; i < arr.length; i++) {if (i == 0) {sb.append(arr[i]);} else {sb.append("|").append(arr[i]);}}return sb.toString();}public static byte[] stringToBytes(String str) {String[] arr = str.split("\\|");byte[] bytes = new byte[arr.length];arr[arr.length - 1] = arr[arr.length - 1].trim();for (int i = 0; i < arr.length; i++) {bytes[i] = Byte.valueOf(arr[i]);}return bytes;}/*** 单机验证授权解析授权⽂件 xxx.lic** @return* @throws WDKException*/public static boolean licenseCheck() {try {String path = SystemTool.getProjectPath();File localFile = new File(path + "\xxx.lic");if (localFile.exists()) {byte[] arrayOfByte = new byte[Integer.parseInt(Long.toString(localFile.length()))];FileInputStream localFileInputStream = new FileInputStream(localFile);localFileInputStream.read(arrayOfByte);localFileInputStream.close();String str = new String(arrayOfByte);// System.out.println("读取⽂件内容:" + str);String decodedData1 = "";String sign = "";String publickey2 = "";if (str.indexOf("$$") != -1) {sign = str.substring(str.indexOf("$$") + 2, str.indexOf("=") + 1);// 签名publickey2 = str.substring(0, str.indexOf("$$"));// 公钥} else {System.out.println("授权⽂件已被修改,如需继续使⽤本软件请重新进⾏授权");return false;}if (str.indexOf("=") != -1) {decodedData1 = str.substring(str.indexOf("=") + 1, str.length() - 1);// 密⽂} else {System.out.println("授权⽂件已被修改,如需继续使⽤本软件请重新进⾏授权");return false;}// System.out.println("解析后的公钥:" + publickey2);byte[] data2 = stringToBytes(decodedData1);// 解析后的密⽂(已加密数据)// 签名验证System.out.println("开始验证签名——————————————————————————————————"); // System.out.println("解析后的签名:" + sign);boolean status = RSAUtils.verify(data2, publickey2, sign);System.err.println("签名验证结果:\r" + status);if (status) {// 签名通过// 解密JSONObject localJSONObject = new JSONObject();long LIC_Frame_endtime;System.out.println("开始解密——————————————————————————————————"); byte[] decodedData = RSAUtils.decryptByPublicKey(data2, publickey2);String target = new String(decodedData); // 明⽂// System.out.println("解密后: \r\n" + target);SimpleDateFormat localSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");localJSONObject = (JSONObject) JSONObject.parse(target);String lictype = localJSONObject.getString("lictype");String machinecode = localJSONObject.getString("machinecode");String endtime = localJSONObject.getString("endtime");String starttime = localJSONObject.getString("starttime");if (SystemTool.ver_MacineCode(machinecode)) {// 机器验证通过if ("1".equals(lictype)) {if ((null == endtime) || ("".equals(endtime))) {LIC_Frame_endtime = 0L;} else {LIC_Frame_endtime = ((Date) localSimpleDateFormat.parseObject(endtime)).getTime();boolean bool = RSAUtils.verifyendTime(LIC_Frame_endtime);// 校验是否过期System.out.println("授权到期时间:" + endtime);System.err.println("授权验证结果:\r" + bool);if (!bool) {System.out.println("授权信息已过期,请重新授权!!");return false;}}} else {System.out.println("授权⽂件类型不正确,请重新授权");return false;}} else {System.out.println("机器码验证失败,请重新授权");return false;}} else {System.out.println("签名验证失败,请重新授权!!");return false;}} else {System.out.println(path + "未发现授权⽂件xxx.lic,请检查...");return false;}} catch (Exception localException) {System.out.println("授权⽂件xxx.lic解析失败...");return false;}return true;}}2、下⾯是⼀个⼯具类 SystemTool.javaimport java.io.BufferedReader;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import .InetAddress;import workInterface;import .SocketException;import .URLDecoder;import .UnknownHostException;import java.security.NoSuchAlgorithmException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern;import org.eclipse.swt.SWT;import yout.GridData;import org.eclipse.swt.widgets.DateTime;/*** @className: SystemTool* @description: 与系统相关的⼀些常⽤⼯具⽅法. ⽬前实现的有:获取MAC地址、IP地址、C硬盘序列号* @author: yjb* @createTime: 2017-12-01 下午10:03:44*/public class SystemTool {/*** 获取当前操作系统名称. return 操作系统名称例如:windows xp,linux 等.*/public static String getOSName() {return System.getProperty("").toLowerCase();}/*** ⽣成加过密的机器码机器码组成:mac物理地址,本机cpu 序列号 C硬盘序列号* @return* @throws IOException* @throws NoSuchAlgorithmException*/public static String getMachineCode() throws IOException, NoSuchAlgorithmException{String str4=getMAC();// mac物理地址String str5=getCpuNumber();//本机cpu 序列号String str6=getSerialNumber("C");//C硬盘序列号String MachineCode= str4+str5+str6;String md5=EncoderByMd5(MachineCode);//md5加密return md5;}/*** 对机器码进⾏MD5加密* @return* @throws IOException* @throws NoSuchAlgorithmException*/public static String EncoderByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException{ //确定计算⽅法MessageDigest md5=MessageDigest.getInstance("MD5");BASE64Encoder base64en = new BASE64Encoder();//加密后的字符串String newstr=base64en.encode(md5.digest(str.getBytes("utf-8")));return newstr;}/*** 验证机器码* @param str 数据源值* @return* @throws NoSuchAlgorithmException* @throws IOException*/public static Boolean ver_MacineCode(String str) throws NoSuchAlgorithmException, IOException {if(str.equals(getMachineCode())){return true;}return false;}/*** mac物理地址* @return*/public static String getMAC() {String os =getOSName();String mac = "";// System.out.println("OS Type:" + os);if (os.startsWith("windows")) {// 本地是windowsmac = getWindowsMACAddress();// System.out.println("MAC Address:" + mac);} else {// 本地是⾮windows系统⼀般就是unixmac = getUnixMACAddress();// System.out.println(mac);}return mac;}/*** 获取unix⽹卡的mac地址. ⾮windows的系统默认调⽤本⽅法获取.如果有特殊系统请继续扩充新的取mac地址⽅法. ** @return mac地址*/public static String getUnixMACAddress() {String mac = null;BufferedReader bufferedReader = null;Process process = null;try {process = Runtime.getRuntime().exec("ifconfig eth0");// linux下的命令,⼀般取eth0作为本地主⽹卡// 显⽰信息中包含有mac地址信息bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line = null;int index = -1;while ((line = bufferedReader.readLine()) != null) {index = line.toLowerCase().indexOf("hwaddr");// 寻找标⽰字符串[hwaddr]if (index >= 0) {// 找到了mac = line.substring(index + "hwaddr".length() + 1).trim();// 取出mac地址并去除2边空格break;}}} catch (IOException e) {e.printStackTrace();} finally {try {if (bufferedReader != null) {bufferedReader.close();}} catch (IOException e1) {e1.printStackTrace();}bufferedReader = null;process = null;}return mac;}/*** 获取widnows⽹卡的mac地址.* ⽤模式匹配⽅式查找MAC地址,与操作系统的语⾔⽆关* @return mac地址*/public static String getWindowsMACAddress(){Pattern macPattern = pile(".*((:?[0-9a-f]{2}[-:]){5}[0-9a-f]{2}).*", Pattern.CASE_INSENSITIVE); String mac = null;try {Process pro = Runtime.getRuntime().exec("cmd.exe /c ipconfig/all");InputStream is = pro.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));String message = br.readLine();int index = -1;while (message != null) {Matcher matcher = macPattern.matcher(message);if (matcher.matches()) {mac= matcher.group(1).trim();break;// macAddressList.add(matcher.group(1).replaceAll("[-:]",// ""));//去掉MAC中的“-”}/* if ((index = message.indexOf("物理地址")) > 0) {mac = message.substring(index + 36).trim();break;}*/message = br.readLine();}br.close();pro.destroy();} catch (IOException e) {System.out.println("Can't get mac address!");return null;}return mac;}/*** @return 本机主机名*/public static String getHostName() {InetAddress ia = null;try {ia = InetAddress.getLocalHost();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (ia == null) {return "some error..";} elsereturn ia.getHostName();}/*** @return 本机IP 地址*/public static String getIPAddress() {InetAddress ia = null;try {ia = InetAddress.getLocalHost();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (ia == null) {return "some error..";} elsereturn ia.getHostAddress();}/*** @return 本机cpu 序列号* @throws IOException*/public static String getCpuNumber() throws IOException {Process process = Runtime.getRuntime().exec(new String[] { "wmic", "cpu", "get", "ProcessorId" }); process.getOutputStream().close();Scanner sc = new Scanner(process.getInputStream());String property = sc.next();String serial = sc.next();//System.out.println(property + ": " + serial);return serial;}/*** 获取硬盘序列号* @param drive* @return*/public static String getSerialNumber(String drive) {String result = "";try {File file = File.createTempFile("realhowto", ".vbs");file.deleteOnExit();FileWriter fw = new java.io.FileWriter(file);String vbs = "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n"+ "Set colDrives = objFSO.Drives\n" + "Set objDrive = colDrives.item(\"" + drive + "\")\n"+ "Wscript.Echo objDrive.SerialNumber"; // see notefw.write(vbs);fw.close();Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));String line;while ((line = input.readLine()) != null) {result += line;}input.close();} catch (Exception e) {e.printStackTrace();}return result.trim();}/*** InputStreamReader和BufferedReader⽅法* 优点: 可以获取键盘输⼊的字符串* 缺点: 如何要获取的是int,float等类型的仍然转码*/public static String ReadTest(){System.out.println("Please input Data:");String name = "";InputStreamReader is = new InputStreamReader(System.in);BufferedReader br = new BufferedReader(is);try{name = br.readLine();}catch(IOException e){e.printStackTrace();}return name;}/*** Scanner类中的⽅法* 优点: 可以获取键盘输⼊的字符串* 优点: 有现成的获取int,float等类型数据,⾮常强⼤,也⾮常⽅便*/public static void ScannerTest(){Scanner sc = new Scanner(System.in);System.out.println("ScannerTest, Please Enter Name:");String name = sc.nextLine();System.out.println("ScannerTest, Please Enter Age:");int age = sc.nextInt();System.out.println("ScannerTest, Please Enter Salary:");float salary = sc.nextFloat();System.out.println("Your Information is as below:");System.out.println("Name:" + name +"\n" + "Age:"+age + "\n"+"Salary:"+salary);}/*** @param date* @param day 想要获取的⽇期与传⼊⽇期的差值⽐如想要获取传⼊⽇期前四天的⽇期 day=-4即可 * @return*/public static Date getSomeDay(Date date, int day){Calendar calendar = Calendar.getInstance();calendar.setTime(date);calendar.add(Calendar.DATE, day);return calendar.getTime();}/*** 取⼯程绝对路径如 e://* @return*/public static String getProjectPath() {try {return URLDecoder.decode(System.getProperty("user.dir"), "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return System.getProperty("user.dir").replace("20%", " ");}/*** 测试⽤的main⽅法.** @param argc* 运⾏参数.* @throws Exception*/public static void main(String[] argc) throws Exception {getSomeDay(new Date(),60);//getWindowsMACAddress();}}3、然后是⼀个 RSA 的⼯具类 RSAUtils.javaimport java.io.ByteArrayOutputStream;import java.security.Key;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import java.security.Signature;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;import javax.crypto.Cipher;/** *//*** <p>* RSA公钥/私钥/签名⼯具包* </p>* <p>* 罗纳德·李维斯特(Ron [R]ivest)、阿迪·萨莫尔(Adi [S]hamir)和伦纳德·阿德曼(Leonard [A]dleman) * </p>* <p>* 字符串格式的密钥在未在特殊说明情况下都为BASE64编码格式<br/>* 由于⾮对称加密速度极其缓慢,⼀般⽂件不使⽤它来加密⽽是使⽤对称加密,<br/>* ⾮对称加密算法可以⽤来对对称加密的密钥加密,这样保证密钥的安全也就保证了数据的安全* </p>** @author IceWee* @date 2012-4-26* @version 1.0*/public class RSAUtils {/** *//*** 加密算法RSA*/public static final String KEY_ALGORITHM = "RSA";/** *//*** 签名算法*/public static final String SIGNATURE_ALGORITHM = "MD5withRSA";/** *//*** 获取公钥的key*/private static final String PUBLIC_KEY = "RSAPublicKey";/** *//*** 获取私钥的key*/private static final String PRIVATE_KEY = "RSAPrivateKey";/** *//*** RSA最⼤加密明⽂⼤⼩*/private static final int MAX_ENCRYPT_BLOCK = 117;/** *//*** RSA最⼤解密密⽂⼤⼩*/private static final int MAX_DECRYPT_BLOCK = 128;/** *//*** <p>* ⽣成密钥对(公钥和私钥)* </p>** @return* @throws Exception*/public static Map<String, Object> genKeyPair() throws Exception {KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);keyPairGen.initialize(1024);KeyPair keyPair = keyPairGen.generateKeyPair();RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();Map<String, Object> keyMap = new HashMap<String, Object>(2);keyMap.put(PUBLIC_KEY, publicKey);keyMap.put(PRIVATE_KEY, privateKey);return keyMap;}/** *//*** <p>* ⽤私钥对信息⽣成数字签名* </p>** @param data 已加密数据* @param privateKey 私钥(BASE64编码)** @return* @throws Exception*/public static String sign(byte[] data, String privateKey) throws Exception {byte[] keyBytes = Base64Utils.decode(privateKey);PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initSign(privateK);signature.update(data);return Base64Utils.encode(signature.sign());}/*** <p>* 校验数字签名* </p>** @param data 已加密数据* @param publicKey 公钥(BASE64编码)* @param sign 数字签名** @return* @throws Exception**/public static boolean verify(byte[] data, String publicKey, String sign)throws Exception {byte[] keyBytes = Base64Utils.decode(publicKey);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);PublicKey publicK = keyFactory.generatePublic(keySpec);Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initVerify(publicK);signature.update(data);return signature.verify(Base64Utils.decode(sign));}/**** 私钥解密*** @param encryptedData 已加密数据* @param privateKey 私钥(BASE64编码)* @return* @throws Exception*/public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey)throws Exception {byte[] keyBytes = Base64Utils.decode(privateKey);PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, privateK);int inputLen = encryptedData.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;byte[] cache;int i = 0;// 对数据分段解密while (inputLen - offSet > 0) {if (inputLen - offSet > MAX_DECRYPT_BLOCK) {cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); } else {cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * MAX_DECRYPT_BLOCK;}byte[] decryptedData = out.toByteArray();out.close();return decryptedData;}/**** 公钥解密*** @param encryptedData 已加密数据* @param publicKey 公钥(BASE64编码)* @return* @throws Exception*/public static byte[] decryptByPublicKey(byte[] encryptedData, String publicKey)throws Exception {byte[] keyBytes = Base64Utils.decode(publicKey);X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key publicK = keyFactory.generatePublic(x509KeySpec);Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, publicK);int inputLen = encryptedData.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;byte[] cache;int i = 0;// 对数据分段解密while (inputLen - offSet > 0) {if (inputLen - offSet > MAX_DECRYPT_BLOCK) {cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); } else {cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * MAX_DECRYPT_BLOCK;}byte[] decryptedData = out.toByteArray();out.close();return decryptedData;}/**** 公钥加密*** @param data 源数据* @param publicKey 公钥(BASE64编码)* @return* @throws Exception*/public static byte[] encryptByPublicKey(byte[] data, String publicKey)throws Exception {byte[] keyBytes = Base64Utils.decode(publicKey);X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key publicK = keyFactory.generatePublic(x509KeySpec);// 对数据加密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, publicK);int inputLen = data.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;byte[] cache;int i = 0;// 对数据分段加密while (inputLen - offSet > 0) {if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);} else {cache = cipher.doFinal(data, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * MAX_ENCRYPT_BLOCK;}byte[] encryptedData = out.toByteArray();out.close();return encryptedData;}/*** 私钥加密*** @param data 源数据* @param privateKey 私钥(BASE64编码)* @return* @throws Exception*/public static byte[] encryptByPrivateKey(byte[] data, String privateKey)throws Exception {byte[] keyBytes = Base64Utils.decode(privateKey);PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, privateK);int inputLen = data.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;byte[] cache;int i = 0;// 对数据分段加密while (inputLen - offSet > 0) {if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);} else {cache = cipher.doFinal(data, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * MAX_ENCRYPT_BLOCK;}byte[] encryptedData = out.toByteArray();out.close();return encryptedData;}/*** 获取私钥** @param keyMap 密钥对* @return* @throws Exception*/public static String getPrivateKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PRIVATE_KEY);return Base64Utils.encode(key.getEncoded());}/**** 获取公钥** @param keyMap 密钥对* @return* @throws Exception*/public static String getPublicKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PUBLIC_KEY);return Base64Utils.encode(key.getEncoded());}/* public static String getMachineCode(){Object localObject = null;if (OSinfo.isWindows()) {localObject = new hwWindow();} else if (OSinfo.isLinux()) {localObject = new hwLinux();}String str1 = ((IHadWare)localObject).getCPUSerial();String str2 = ((IHadWare)localObject).getDriverSerial();String str3 = ((IHadWare)localObject).getMacSerial();System.out.println("cpu=" + str1 + " driverserial=" + str2);String str4 = str1 + str2;str4 = uMD5.MD5(str4);return str4;}*//*** 验证机器码* @param paramString* @return* @throws java.text.ParseException*//* public static boolean verifyMachineCode(String paramString){boolean bool = false;String str = HardWare.getMachineCode();System.out.println("【本机机器码】:[" + str + "]");if (str.equals(paramString)) {bool = true;}return bool;}*/public static boolean verifyendTime(Long endtime) throws java.text.ParseException {boolean bool = false;SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String str1 = df.format(new Date());long nowtime = ((Date) df.parseObject(str1)).getTime();// System.out.println("当前时间:"+nowtime+"授权时间到期时间:" +endtime);。

浅析软件许可证授权(license授权管理)

浅析软件许可证授权(license授权管理)

浅析软件许可证授权软件许可证授权是某软件开发者使用特殊技术手段来规范用户按授权许可模式合法合理使用软件,其中包括约定软件的使用时长、使用功能、终端安装数量等。

这种技术是以授权许可文件的形式安装在使用者的计算机上。

授权许可文件采用与计算机软硬件信息绑定的方式来防止软件的非法盗用和越权使用。

绑定计算机的软件信息包括:计算机名、用户名、IP地址、注册表系统信息等。

绑定计算机的硬件信息包括:CPU、BIOS、硬盘、MAC地址等。

常规而言,绑定计算机硬件信息的授权许可方式比绑定计算机软件信息的授权方式安全性来的高,因为硬件信息相比软件信息要更加稳定,而且难以复制或伪造。

考虑到计算机的硬件有可能发生变动,可以采用智能判断方式,只要50%-90%的硬件信息没有改变,就认为是同一台计算机。

通常来说,授权内容与计算机软硬件信息的绑定过程和授权文件解析过程中计算机软硬件信息的比较是许可证授权机制的核心技术。

使用简单变换或对称加密算法的绑定机制是不安全的,因为可逆的绑定机制在软件运行时可以被跟踪出来,从而出现模拟绑定过程的注册机破解。

而使用非对称加密算法,即公私钥算法的绑定机制要安全的多。

因为私钥是放在服务上,由私钥完成授权内容与计算机软硬件信息的绑定。

授权许可文件由存储在客户端的公钥进行解密。

由于加解密过程不对称,而私钥和绑定过程无法跟踪,所以采用非对称加密算法的授权许可文件系统具有非常高的安全性。

互联网的逐渐普及和快速发展极大地改变了我们工作和生活的方式。

软件许可证授权技术也开始与互联网技术全面结合,达到了方便使用、节省成本和提高效率的目的。

基于互联网的软件授权许可证保护技术与使用额外硬件设备,如加密锁等的保护技术相比,有以下几方面优势:1.能够大大节约硬件、存储、物流、生产和管理成本。

2.可以实现软件的网络电子化发行,下载试用和激活都非常方便和快捷。

3.方便对软件授权进行统一管理,有助于提升企业管理水平和改善用户体验。

软件授权文件linse

软件授权文件linse

软件授权文件license在完成软件开发以后,往往需要将软件打包并发送给用户使用。

但是若只希望给特定的用户进行使用,那么就需要将软件设置License(许可证)。

本篇文章就来提供一种生成license文件的思路。

软件license文件生成器1、前言软件开发商完成一个软件的模块,希望交付给用户进行使用。

软件开发商一般是希望只授权给某些用户使用,而不希望软件被其他未授权用户进行使用。

因此需要开发一个软件授权的机制。

用户安装或者第一次使用软件的时候,软件是没有被授权的。

当用户希望将软件绑定到某一台特定的计算机进行使用时,提交目标计算机的MAC地址给软件开发商,收到开发商的授权以后就能正常使用软件了。

软件开发商收到授权请求时,获得软件安装的目标计算机的MAC地址。

通过一套绑定mac地址的算法,生成了一个license,并且具有license失效的时间。

生成的license同软件中内置的同一套算法生成的信息进行比对,如果比对上,那么授权成功。

如果比对不上或者授权过期,那么授权失败。

2、使用pyqts5开发2.1框架1、获取目标计算机的mac地址2、设置license过期的时间3、对mac和授权时间进行加密4、生成激活码并保存到.lic文件中5、软件读取.lic文件,并和内置算法生成的激活码比较2.2算法算法的核心就是,对mac地址进行hash计算。

为了增加生成的license文件的困难度,在mac地址之前再加上一个特定的字符,让该license生成软件的破解难度可以稍微提高。

例如在这里的示例代码中,特定字符暂定为first_key。

Hash算法的特点是,HASH的设计以无法解为目的;简单说来就是正向简单,逆向困难。

1、得到密钥,通过hash算法计算目标计算机的mac地址pow=hash_msg('first_key'+str(self.mac_adds))新建一个license_str的字典,用于保存真实的mac地址,license失效时间,加密后的字符串license_str={}license_str['mac']=self.mac_addslicense_str['time_str']=self.active_datelicense_str['psw']=pow生成的incense_str作为一个字典,写入license文件中,是可以很直接地看出其组成。

博科交换机授权license激活新版

博科交换机授权license激活新版

博科交换机授权license激活2012版登录博科官网:https:///siteminderagent/forms/portal/mybrocade_login.fcc?TYPE=1006632 97&REALMOID=06-0002d1a1-df35-1b1e-9f57-487dac109070&GUID=&SMAUTHREASON=0&METHOD=GET&SMA GENTNAME=-SM-mCX5knzdtHJNFbsHsyunp%2fL82AijI371malzd8n2JGFSddGLDSy8Vu6Vg3a8n58X&TARGET= -SM-http%3a%2f%2fmy%2ebrocade%2ecom%2fwps%2fmyportal%2fmyhome%2f在右上角有mybrocade链接。

注册一个账号,需要是公司邮箱,并且有博科的产品序列号。

登录到mybrocade之后找到licensing tools,点击“enter the software portal”这里有多种博科产品的license激活选项。

博科光纤交换机的激活是在“Brocade FOS”在必填的选项中填入相关信息。

Email地址用来接收生成license信息ID Type可以输入产品的序列号“Serial #”,也可以输入LID就是机器的WWN号,另外还可以输入主板的序列号。

Transaction key是购买的博科激活license输入正确信息后点击“add”,可以看到description里显示激活license的类型,这里是EF的license点击Generate生成激活码。

点击license可以看到生成好的激活码。

同时在你输入的邮箱中也会受到相应的注册信息。

微软LIC授权培训

微软LIC授权培训
软件的价值是体现在软件的许可上,而不是软件的光盘或包装。 许可证是授权用户可以使用该软件,并不是包括复制软件的权利证明。 许可证是企业用户的资产!
什么是软件盗版
“软件盗版”概念涵盖下列行为:非法复制软件程序,假冒并发售软 件品--就连与朋友共享某一程序也在盗版行为之列。
软件盗版的形式多种多样:
从而更便捷地在线 管理许可证 通过电子订单确认的方式缩短交货周期,提供更迅速的许可证交付和软件下
载。 举例来说,分销商下完订单后,一般需要2至3周才能把纸质许可证交付给 最终用户,但是电子许可证的交付最快仅需要3天。 降低了渠道合作伙伴交付产品的成本(因而间接降低了最终用户的采购成本)
2010年7月5日开始电子许可证的交付方式
Microsoft Licensing Program Training
我们的议程
软件许可的概念
什么是软件的许可? 软件盗版
软件许可赋予您使用软件的合法权利。对于您所使用的每一个软件程序, 您都需要有一个许可,它以许可协议的形式体现。
您对软件产品的使用受许可协议条款以及版权法的制约。根据中国著作权 法的规定,未经版权所有者的特别授权,制作或销售版权资料(包括计算 机程序)是非法的。
开放式许可协议的订购流程
微软六家总代理名单
总代理 总代理 总代理
长城 佳杰 方正 神码 英迈 联强
开放式许可协议的样式(旧)
开放式许可协议的样式(新,2006年2月1日开始采用)
2010年7月5日开始电子许可证的交付方式
微软中国将从2010年7月5日起,开始实施 Open e-License计划。 届时,开放 式许可证的默认交付方式将改为电子许可证。我们的客户可以从微软的在线工具批量许可服务中心 (VLSC)上获取电子许可证。假以时日,微软的所有批量授权计 划 (包括Select, Enterprise, Open Value, Campus 及School 等)都将实施在 线交付模式。

华为交换机license激活步骤

华为交换机license激活步骤

华为交换机license激活步骤华为交换机是企业网络中不可或缺的一部分,而license激活则是使用华为交换机前必须要完成的步骤之一。

本文将详细介绍华为交换机license激活的步骤及注意事项,帮助读者顺利完成激活。

步骤一:获取license文件要进行华为交换机license激活,首先需要获取license文件。

一般情况下,华为交换机的license文件需要向华为官方或其授权代理商购买,所以读者需要确保已经获得了正确的license文件。

步骤二:登录交换机在进行华为交换机license激活之前,需要先登录交换机。

登录时,需要使用管理员账号和密码,确保拥有足够的权限来进行license 激活操作。

步骤三:上传license文件登录成功后,需要通过命令行界面(CLI)或Web界面(WebUI)上传license文件。

使用CLI上传license文件的命令如下:<switch> system-view[switch] license load file usbflash0:filename.lic其中,filename.lic是上传的license文件名。

使用WebUI上传license文件的步骤如下:1. 登录WebUI界面;2. 点击“系统”菜单,选择“License管理”;3. 点击“导入”按钮,选择上传的license文件。

步骤四:激活license上传license文件后,还需要对其进行激活。

使用CLI进行license 激活的命令如下:<switch> system-view[switch] license active file usbflash0:filename.lic其中,filename.lic是上传的license文件名。

使用WebUI进行license激活的步骤如下:1. 登录WebUI界面;2. 点击“系统”菜单,选择“License管理”;3. 点击“激活”按钮,选择需要激活的license文件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

当 Automation License Manager 在 Windows 2000 操作系统上安装失败,提示信息为“Server service not active”时,如何安装 ALM?
显示订货号
6ES7810-4.. SIMATIC S7, STEP7 Vx.x
6ES7810-5.. SIMATIC S7, STEP7 PROF
说明:
在 Windows 2000 的控制面板选项中,检查 Server 服务是否激活。

如果 Server 服务只是停止或终止了,可以按照下表描述方法去激活 Server 服务,然后再安装 Automation License Manager ,就没有任何问题了。

详细过程如下:
No.过程
1 在 Windows 2000 的控制面板中打开“Administration”对话框,步骤如下:
•"Start > Settings > Control Panel > Administration"
2 在“Administration”对话框中,打开“Services”选项。

此处,在 “Status”列中可以看到
Server 服务是否激活(Status: Started)。

3 在 “Services”对话框 (图 01) ,选中“Server”点击右键,在弹出的菜单中选择“Properties”。

( 20 KB )
图 01
4 在打开的“Properties of Server”对话框中,打开“General”标签页(图 02),点击“Start”按钮启
动Service服务。

( 11 KB )
图 02
如果 Service 服务没有激活,可以操作“Start”按钮去启动 Server 服务,否则“Start”按钮是灰色的且不能被激活。

在这种情形下,点击“Continue”,继续或启动服务器之后,在“Services”
对话框中对应列位置显示服务器状态为“Started” (图 01)。

5 点击 OK 按钮,关闭“Properties of Server”对话框,然后就可以安装 Automation License
服务也会显示在“Dependencies”标签页中。

( 10 KB )
to interact with desktop”选项(图 04
( 11 KB )
How can you install the Automation License Manager when the installation in Windows 2000 is aborted with the message "Server service not active"?
Display part number
6ES7810-4.. SIMATIC S7, STEP7 Vx.x
6ES7810-5.. SIMATIC S7, STEP7 PROF
Instructions:
In Windows 2000 check whether the Server service is disabled in the Control Panel. The table below describes how to proceed to enable the Server service. If the Server is only stopped or terminated,
select "Properties".
( 20 KB ) Fig. 01
service. For this you click on the "Start" button.
( 11 KB )
( 10 KB )
Fig. 03
enable the option "Allow service to interact with desktop" (Fig. 04).
( 11 KB )
Fig. 04。

相关文档
最新文档