使用Java模拟Web端的POST或GET请求,实现自动化操作:加密狗烧制技术详解
简介
硬件锁(加密狗)加密软件。与金雅特公司合作的方式是:买家公司开发一个授权程序(这里公司的授权程序:Encrypt类的encrypt()方法),进行授权管理用户锁。
注意
:LZ只演示模拟Web端的POST或GET请求过程,以达到自动化实现加密狗烧制。
需求:
公司要求,优化硬件锁加密狗的烧制过程,通过程序自动化的完成加密狗烧制,摆脱鼠标点击网页。
实战操作如下
前提:主机上部署好了SentinelEMS服务,并且插好主锁和子锁
全局变量
模拟请求的时候需要IP,会话ID、COOKIE、用户名、密码、产品id、功能id、产品名等数据。
private static String reqIP = "http://localhost:8080/";private static String req80 = "http://localhost:8080";private static String reqEmsIP = "http://127.0.0.1:1947/";private static String reqHostIP = "localhost:8080";private static String reqHostEmsIP = "127.0.0.1:1947";private static String JSESSIONID = "";private static String COOKIES = "";private static String USERNAME = "admin";private static String PASSWORD = "yourPassword";private static String ET = "";private final static String PRODUCTID = "yourProductId";private final static String FEATUREID = "yourFeatureId";private final static String PRODUCTNAME = "yourProductName";
main方法
需要注意的是26157
是自己主锁的ID
public static void main(String[] args) throws InterruptedException, IOException {//校验加密狗是否插入;String dogId = "";String isJoin = getRequestApi(new URL(reqEmsIP+"sentinel/ldk/v1/26157/keys?rndNo=" + System.currentTimeMillis()),0);if(isJoin.contains("error")){System.out.println("请先插入加密狗!");Thread.sleep ( 3000 ) ;return;}else{dogId = isJoin.substring(isJoin.indexOf("<id>")+4,isJoin.indexOf("</id>"));}//校验是否已经烧制了CheckLicense check=new CheckLicense();String numString = check.CheckIsLicense();if("".equals(numString)){//加密狗烧制encryptDog(dogId);}else{System.out.println("该加密狗已经烧制加密过,是否格式化重做,请输入想要执行功能的数字:1.是,0.否");Scanner scanIn = new Scanner(System.in);String number = scanIn.nextLine();int num=Integer.parseInt(number);if(num == 0){System.gc();System.exit(0);}else if (num == 1){//加密狗烧制encryptDog(dogId);}else{System.out.println("请按指示操作!!!");System.gc();System.exit(0);}}}
加密狗烧制
模拟post和get请求的参数和请求头中关键属性要准确
,否则返回的数据不是正确的
/*** 加密狗烧制** @param dogId 加密狗id* @author yangz* @date 2023/04/12*/public static void encryptDog(String dogId) throws InterruptedException, IOException{//开始烧制加密狗System.out.println("正在烧制加密狗中,请稍等。。。");//step1:登录// 设置请求表单数据String data = "user_type=" + URLEncoder.encode("ISV", "UTF-8") +"&username=" + URLEncoder.encode(USERNAME, "UTF-8") +"&password=" + URLEncoder.encode(PASSWORD, "UTF-8") +"&siteLanguage=" + URLEncoder.encode("zh", "UTF-8") +"&myReferer=" + URLEncoder.encode(reqIP, "UTF-8");postRequestApi(new URL(reqIP + "ems/verifyLogin.html"), data, true,0);//step2:进入授权页面getRequestApi(new URL(reqIP+"ems/loadEntitlementPage.html?rnd=" + System.currentTimeMillis()),0);//step3:选择RORBX锁类型getRequestApi(new URL(reqIP+"ems/getEntitlements.html?pageIndex=1&pageSize=15&sortCol=id&sortOrder=desc&searchOn=all&searchText=&vendorId=2&rnd=" + System.currentTimeMillis() / 10000),0);//step4:进入录入锁查询锁信息getRequestApi(new URL(reqIP+"ems/keyInfo.html?javaEnabled=false&rnd="+System.currentTimeMillis()),2);//step5:获取C2V-nodogid信息String c2vNoDog = getRequestApi(new URL(reqEmsIP+"sentinel/ldk/v1/26157/keys/"+dogId+"/c2v?rndNo="+System.currentTimeMillis()),0).replaceAll("\"","\\\\\"");//step6:获取keyinfo信息/*StringBuffer keyinfoBuffer = new StringBuffer("[{\"c2v\":\""+c2vNoDog+"\"}]");String keyinfoString = bufferToSpecialString(keyinfoBuffer);String keyinfoData = "c2v=" + keyinfoString + "&ET="+URLEncoder.encode(ET, "UTF-8");String keyinfoRep = postRequestApi(new URL(reqIP+"ems/getkeyInfoJson.html?resultentProtectionTypeId=1"),keyinfoData,false,2);*///step6:获取C2V信息String c2v = getRequestApi(new URL(reqEmsIP+"sentinel/ldk/v1/26157/keys/"+dogId+"/c2v?rndNo="+System.currentTimeMillis()+"?"+dogId),0);//step7:点击录入锁信息String isJSON = "c2v=" + URLEncoder.encode(c2v, "UTF-8");String c2vinfoData = isJSON + "&ET="+URLEncoder.encode(ET, "UTF-8");String joinLock = postRequestApi(new URL(reqIP + "ems/c2vinfo.html?isJSON=true"), c2vinfoData, false,2);if(!joinLock.contains("No features found on key")){//step8:格式化锁信息StringBuffer c2vStringBuffer = new StringBuffer("[{\"haspId\":\""+dogId+"\",\"c2v\":\""+c2vNoDog+"\"}]");String c2vString = bufferToSpecialString(c2vStringBuffer);String recycleData = "c2v=" + c2vString + "&ET="+URLEncoder.encode(ET, "UTF-8");String fommatRep = postRequestApi(new URL(reqIP+"ems/recycler.html?isJSON=true"),recycleData,false,2);if(fommatRep.length()>0){//step9:回收c2v,调用v2cJSONArray jsonArray = new JSONArray(fommatRep);JSONObject jsonObject = jsonArray.getJSONObject(0);String v2cData = jsonObject.getString("v2c");postRequestApi(new URL(reqEmsIP+"sentinel/ldk/v1/26157/v2c"),v2cData,false,2);}//step10:更新c2v信息//String c2vUpdateString = requestSentinelEms(new URL(reqEmsIP+"sentinel/ldk/v1/26157/keys/"+dogId+"/c2v?rndNo="+System.currentTimeMillis()+"?"+dogId),0);//System.out.println(c2vUpdateString);}//step11:进入新增授权界面getRequestApi(new URL(reqIP+"ems/addEntitlementPopUp.html?vendorId=2&enfId=1&pageIndex=1&rnd="+ System.currentTimeMillis()),2);//step12:查询产品并添加getRequestApi(new URL(reqIP+"ems/getProductsByIds.html?productIds="+PRODUCTID+"&mode=add&rnd="+ System.currentTimeMillis()),2);//step13:获取生成HL锁的lineItemId和pkIdString formattedDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));String entitlementXMLString = "<entitlement><enabled>true</enabled><action>Commit</action><isTest>false</isTest><customerId/><customerEmail/><partnerId/><partnerEmail/><refId1/><refId2/><description/><proContId/>" +"<startDate>"+formattedDate+"</startDate><endDate>2500-12-31</endDate><identity/><policy><revocationAllowed>true</revocationAllowed><registrationRequired>DESIRED</registrationRequired></policy><entitlementItem><priority>D</priority><type>CLOUD_KEY</type><deploymentType/><featureCachingMode/><containerType>0</containerType>" +"<startDate>"+formattedDate+"</startDate><endDate>2500-12-31</endDate><itemLicenseType>0</itemLicenseType><lineItemType>Hardware_Key</lineItemType><numActivationPerProductKey>1</numActivationPerProductKey><numProductKeys>1</numProductKeys><vendorId>2</vendorId><enforcementId>1</enforcementId><itemProduct><isRevoked>false</isRevoked>" +"<productId>"+PRODUCTID+"</productId><product><productName>"+PRODUCTNAME+"</productName><rehost>LEAVE_AS_IS</rehost><productFeatureRef><actionName>NONE</actionName><featureId>"+FEATUREID+"</featureId><productFeatureLicenseModel><actionName>NONE</actionName><licensemodel><licenseModelId>4</licenseModelId>" +"</licensemodel></productFeatureLicenseModel></productFeatureRef></product></itemProduct><activationAttribute><attributeName>ACKNOWLEDGEMENT_REQUEST</attributeName><attributeValue>false</attributeValue></activationAttribute>" +"<memorySegments></memorySegments></entitlementItem></entitlement>";//SentinelEMS服务8.4版本,跳转ems/addEntitlement.html界面的参数String lineItem84Data = "entitlementXML=" + URLEncoder.encode(entitlementXMLString, "UTF-8") +"&entProductDynamicMemoryDataXml="+URLEncoder.encode("<dynamicMemorySegments></dynamicMemorySegments>", "UTF-8") +"&produceAndPush="+URLEncoder.encode("false","UTF-8")+"&lineItemTypeForProdPush=&vendorIdForProdPush=" +"&ET="+URLEncoder.encode(ET, "UTF-8");//SentinelEMS服务7.9版本,跳转ems/addEntitlement.html界面的参数/*String lineItem79Data = "entitlementXML=" + URLEncoder.encode(entitlementXMLString, "UTF-8") +"&entProductDynamicMemoryDataXml="+URLEncoder.encode("<dynamicMemorySegments></dynamicMemorySegments>", "UTF-8") +"&ET="+URLEncoder.encode(ET, "UTF-8");*/String lineItemRep = postRequestApi(new URL(reqIP+"ems/addEntitlement.html"),lineItem84Data,false,2);//String lineItemRep = postRequestApi(new URL(reqIP+"ems/addEntitlement.html"),lineItem79Data,false,2);JSONObject jsonObject = new JSONObject(lineItemRep);int lineItemId = jsonObject.getInt("lineItemId");JSONArray pkIds = jsonObject.getJSONArray("pkIds");String pkId = pkIds.getString(0);//step14:进入生成SentinelHL锁界面getRequestApi(new URL(reqIP+"ems/updatePhysicalKey.html?id="+lineItemId+"&pkId="+pkId+"&javaEnabled=false&rnd="+ System.currentTimeMillis()),2);//step15:烧制加密狗前打开链路String blinkOnData = "<blink>ON</blink>";postRequestApi(new URL(reqEmsIP+"sentinel/ldk/v1/26157/keys/"+dogId+"/blink"),blinkOnData,false,0);//step16:重新生成c2vString burnC2v = getRequestApi(new URL(reqEmsIP+"sentinel/ldk/v1/26157/keys/"+dogId+"/c2v?rndNo="+System.currentTimeMillis()),0).replaceAll("\"","\\\\\"");//step17:烧制写入功能StringBuffer c2vXmlStringBuffer = new StringBuffer("[{\"haspId\":\""+dogId+"\",\"c2v\":\""+burnC2v+"\"}]");String c2vXmlString = bufferToSpecialString(c2vXmlStringBuffer);String burnnerData = "c2v=" + c2vXmlString + "&ET="+URLEncoder.encode(ET, "UTF-8");String burnRep = postRequestApi(new URL(reqIP+"ems/burner.html?pkId="+pkId+"&lineItemId="+lineItemId+"&action=burn&isJSON=true"),burnnerData,false,2);if(burnRep.length()>0){//step18:回收c2v,调用v2cJSONArray burnArray = new JSONArray(burnRep);JSONObject burnObject = burnArray.getJSONObject(0);String burnV2cData = burnObject.getString("v2c");postRequestApi(new URL(reqEmsIP+"sentinel/ldk/v1/26157/v2c"),burnV2cData,false,2);}//step19:烧制加密狗后关闭链路String blinkOffData = "<blink>OFF</blink>";postRequestApi(new URL(reqEmsIP+"sentinel/ldk/v1/26157/keys/"+dogId+"/blink"),blinkOffData,false,0);if("".equals(burnRep)||burnRep.length()<1|| "null".equals(burnRep)){System.out.println("烧制加密狗失败!");System.gc();System.exit(0);}else {System.out.println("烧制加密狗成功!");}System.out.println("开始加密加密狗,请按如下指示操作!");Encrypt crypt=new Encrypt();crypt.encrypt();}
对特殊的buffer字符串进行处理
对一些特定参数转换,注意
:java中"\
“用四个”\
"来表示,utf-8中的空格用20%来表示,对于?
、[
、{
、+
等特殊字符需要\\
来转义
/*** 对特殊的buffer字符串进行处理** @param stringBuffer 字符串缓冲区* @return {@link String }* @author yangz* @date 2023/04/12*/public static String bufferToSpecialString(StringBuffer stringBuffer){String str = stringBuffer.toString().replaceAll(" ", "%20").replaceAll("\\\\", "%5C").replaceAll("/", "%2F").replaceAll("\\?", "%3F").replaceAll("\"", "%22").replaceAll(":", "%3A").replaceAll("\\[", "%5B").replaceAll("]", "%5D").replaceAll("\\{", "%7B").replaceAll("}", "%7D").replaceAll("<", "%3C").replaceAll(">", "%3E").replaceAll("\\+", "%2B").replaceAll("=", "%3D").replaceAll("\r", "%5Cr").replaceAll("\n", "%5Cn").replaceAll("\t", "%5Ct");return str;}
get请求api
/*** get请求api** @param url url* @param vendorId 供应商id* @return {@link String }* @author yangz* @date 2023/04/12*/public static String getRequestApi(URL url, int vendorId) throws IOException{HttpURLConnection cons = (HttpURLConnection) url.openConnection();String now_cookie = COOKIES;if(vendorId>0){now_cookie += "vendorId="+vendorId;}cons.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36");if(!"".equals(now_cookie)){cons.setRequestProperty("cookie", now_cookie);cons.setRequestProperty("ET", ET);}cons.setRequestProperty("referer", req80);cons.setRequestProperty("X-Requested-With", "XMLHttpRequest, EMS");if (url.getPort()==1947) {cons.setRequestProperty("Host", reqHostEmsIP);}else{cons.setRequestProperty("Host", reqHostIP);}cons.connect();int responseCode = cons.getResponseCode();String response;if (responseCode == HttpURLConnection.HTTP_OK) {response = readFromStream(cons.getInputStream());} else {response = String.valueOf(responseCode);}cons.disconnect();return response;}
从流中读取数据
请求后有的是返回流数据,需要使用InputStream的read方法获取流中的数据
/*** 从流中读取数据** @param inputStream 输入流* @return {@link String }* @author yangz* @date 2023/04/12*/public static String readFromStream(java.io.InputStream inputStream) throws java.io.IOException {byte[] buffer = new byte[1024];int len;StringBuilder sb = new StringBuilder();while ((len = inputStream.read(buffer)) != -1) {sb.append(new String(buffer, 0, len, "UTF-8"));}return sb.toString();}
post请求api
踩坑记录
:有些请求头这里设置了会冲突乱码之类的。比如Accept属性,Accept属性是用来告诉服务器客户端可以接受的响应类型(MIME 类型)及相应的优先级。如果你设置了Content-Type属性,再设置Accept属性则会乱码。所以只设置Content-Type属性即可
/*** post请求api** @param url url* @param data 数据* @param isLogin 是否为登录* @param vendorId 供应商id* @return {@link String }* @author yangz* @date 2023/04/12*/public static String postRequestApi(URL url,String data,boolean isLogin,int vendorId)throws IOException{HttpURLConnection cons = (HttpURLConnection) url.openConnection();if(isLogin){cons.setInstanceFollowRedirects(false);}// 设置请求方法cons.setRequestMethod("POST");String now_cookie = COOKIES;if(vendorId>0){now_cookie += "; vendorId="+vendorId;}// 设置请求头cons.setRequestProperty("Connection", "keep-alive");cons.setRequestProperty("Referer", reqIP);cons.setRequestProperty("Content-Length", String.valueOf(data.length()));cons.setRequestProperty("sec-ch-ua-platform", "Windows");cons.setRequestProperty("Sec-Fetch-Dest", "empty");cons.setRequestProperty("Sec-Fetch-Mode", "cors");cons.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36");cons.setRequestProperty("Referrer-Policy", "strict-origin");if(data.contains("blink")){cons.setRequestProperty("Sec-Fetch-Site", "cross-site");cons.setRequestProperty("Content-Type", "text/xml");}else{cons.setRequestProperty("Cookie", now_cookie);cons.setRequestProperty("Sec-Fetch-Site", "same-origin");cons.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");cons.setRequestProperty("ET", ET);cons.setRequestProperty("sec-ch-ua", "\"Google Chrome\";v=\"111\", \"Not(A:Brand\";v=\"8\", \"Chromium\";v=\"111\"");cons.setRequestProperty("X-Requested-With", "XMLHttpRequest, EMS");}// 开启输出流cons.setDoOutput(true);DataOutputStream wr = new DataOutputStream(cons.getOutputStream());wr.writeBytes(data);wr.flush();wr.close();// read response/*int responseCode = cons.getResponseCode();System.out.println(responseCode);*/BufferedReader in = new BufferedReader(new InputStreamReader(cons.getInputStream()));String inputLine;StringBuffer response = new StringBuffer();while ((inputLine = in.readLine()) != null) {response.append(inputLine);}in.close();//判断是否为登录接口if(isLogin){// 获取HTTP响应的头信息Map<String, List<String>> headers = cons.getHeaderFields();// 获取Set-Cookie属性值List<String> cookieList = headers.get("Set-Cookie");if (cookieList != null) {for (String cookie : cookieList) {// 查找JSESSIONID属性if (cookie.startsWith("JSESSIONID=")) {String jsessionId = cookie.split(";")[0];JSESSIONID = jsessionId.split("=")[1];ET = jsessionId.split("=")[1];}}}if (!"".equals(JSESSIONID)) {// 构建重定向的目标URLString redirectUrl = reqIP+"ems/homePage.html?siteLanguage=en_US&ET=" + JSESSIONID;// 设置重定向响应头cons.disconnect();cons = (HttpURLConnection) new URL(redirectUrl).openConnection();COOKIES = "siteLanguage=en; JSESSIONID="+JSESSIONID+"; siteLanguage=en; loginInfo=ISV";cons.setRequestProperty("Cookie", COOKIES);cons.connect();}}return response.toString();}
结果如下:
之前写入过license,输入1
即重新烧制加密狗
结束语:所有的痛苦都是上天给予的成长提示
使用Java模拟Web端的POST或GET请求,实现自动化操作:加密狗烧制技术详解相关推荐
- Java在Web端微信公众号授权登录
Java在Web端微信公众号授权登录 1.需要在微信开发平台配置 url:是自己服务中的微信需要推给你的地址(需要使用二级域名,可以去添加链接描述)购买9块钱1个月使用权或者白嫖都可 token 这个 ...
- JAVA毕业设计Web端校园报修系统计算机源码+lw文档+系统+调试部署+数据库
JAVA毕业设计Web端校园报修系统计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计Web端校园报修系统计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B/S架构 ...
- backbone java_Backbone和Angular Java技术详解
Tomcat系列之Java技术详解 将不同的思想和工具进行对比,是一种更好地理解它们的方式.在本文中,我首先将列举在创建web应用程序时需要重复进行的各项任务,随后为你展现Backbone和Angul ...
- java canvas详解_HTML5的canvas绘图技术详解
原标题:HTML5的canvas绘图技术详解 本篇教程探讨了HTML5的canvas绘图技术详解,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 . < canvas ...
- mongodb java查询_java操作mongoDB查询的实例详解
java操作mongo查询的实例详解 前言: MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库 ...
- java技术详解_Java反射技术详解及实例解析
前言 相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解APT替 ...
- java 李刚 pdf_Java数据库技术详解(李刚) PDF_源雷技术空间
资源名称:Java数据库技术详解(李刚) PDF 第一篇 数据库基础篇 第1章 Java和数据库 2 1.1 Java概述 2 1.1.1 跨平台性 2 1.1.2 面向对象 2 1.1.3 安全性 ...
- 移动端实时音视频直播技术详解(一):开篇
移动端实时音视频直播技术详解(一):开篇 1.引言 随着互联网用户消费内容和交互方式的升级,支撑这些内容和交互方式的基础设施也正在悄悄发生变革.手机设备拍摄视频能力和网络的升级催生了大家对视频直播领域 ...
- 【音视频第6天】基础知识-移动端实时音视频直播技术详解和开源工程WebRTC的技术原理和使用浅析
本文是系列文章中的第1篇,本系列文章的大纲如下: <移动端实时音视频直播技术详解(一):开篇> <移动端实时音视频直播技术详解(二):采集> <移动端实时音视频直播技术详 ...
最新文章
- 会议重点介绍芯片设计中的人工智能
- Enda 的 2015 下半年读书计划
- mysql等待事件类型_Oracle中常见的33个等待事件小结
- UA MATH524 复变函数14 Laurent级数
- linux查看文件只会用vi?除了vi,这几个文件查看的命令,让你爱不释手!
- BCP utility in Sybase(Unix Environment)
- 【数据结构与算法】之深入解析“单词接龙II”的求解思路与算法示例
- java遍历所有目录和文件
- 以太网交换机的概念,网络接口和主要特点
- 共用数据库和上传的文件的laravel-admin 和 laravel 项目中文件保存路径的配置
- 随想录(大学给了我们什么)
- 上传excel腾讯云服务器,使用SpringBoot上传文件到腾讯云
- Html5游戏开发-145行代码完成一个RPG小Demo
- Yahoo的14条准则
- 信用评分卡(python)
- NVIDIA英伟达GPU显卡算力一览(包含Tesla和GeForce、TITAN及RTX系列等)
- c语言求最小值函数min的用法,C语言--min的宏定义
- 基于openGauss的五子棋AI项目
- 玩客云pc端_玩客云下载 玩客云电脑版下载
- spyder中安装第三方库的包
热门文章
- 概率统计及其应用第三章知识总结_2020考研数学概率论与数理统计:各章节考试重点分析...
- EDB 服务器空间满,问题追查:
- Scala语言学习一——基础语法
- 最新内测版Android qq,qq8.0.5内测版下载
- 【Spring Boot】Spring Boot 2.x + Spring Security OAuth2 2.3.3 出现 bad client credentials 错误的踩坑记录
- Filter过滤器的生命周期和工作原理
- 麦当劳进入中国内地市场三十周年,官方周边店线上开业
- FineUI秘密花园(七) — 上传控件
- 【原创】关闭/开启 T470P 的触屏功能
- 小猫爪:PMSM之FOC控制05-让电机开环转起来