电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Springboot如何實現Web系統License授權認證

瀏覽:2日期:2023-05-15 13:30:42

在我們做系統級框架的時候,我們要一定程度上考慮系統的使用版權,不能隨便一個人拿去在任何環境都能用,所以我們需要給我們系統做一個授權認證機制,只有上傳了我們下發的lic文件并驗證通過,才能正常使用,下面就開始一步一步實現這個功能

1.生成機器碼

我們首先要做的就是對軟件部署的環境的唯一性進行限制,這里使用的是macadderss,當然你也可以換成cpu序列編號,并無太大影響,先上代碼

private static String getMac() { try { Enumeration<NetworkInterface> el = NetworkInterface .getNetworkInterfaces(); while (el.hasMoreElements()) {byte[] mac = el.nextElement().getHardwareAddress();if (mac == null) continue;String hexstr = bytesToHexString(mac);return getSplitString(hexstr, '-', 2).toUpperCase(); } } catch (Exception exception) { exception.printStackTrace(); } return null; } public static String getMachineCode() throws Exception{ Set<String> result = new HashSet<>(); String mac = getMac(); result.add(mac); Properties props = System.getProperties(); String javaVersion = props.getProperty('java.version'); result.add(javaVersion); String javaVMVersion = props.getProperty('java.vm.version'); result.add(javaVMVersion); String osVersion = props.getProperty('os.version'); result.add(osVersion); String code = Encrpt.GetMD5Code(result.toString()); return getSplitString(code, '-', 4); }

這里進行的操作是取出機器碼,與java版本,jvm,操作系統參數進行混合,并進行MD5操作

2.進行lic文件的生成

Springboot如何實現Web系統License授權認證

Springboot如何實現Web系統License授權認證

這是我生成證書與進行授權證書的界面,可以看到授權證書主要包含三個要素,機器碼,是否永久有效標識,證書時效,我們會將這些數據寫入文本中并進行加密處理,看下生成證書的代碼

public static void getLicense(String isNoTimeLimit, String licenseLimit, String machineCode, String licensePath, String priavateKeyPath) throws Exception{ String[] liccontent = {'LICENSEID=yanpeng19940119@gmail.com','LICENSENAME=YBLOG使用證書',MessageFormat.format('LICENSETYPE={0}',isNoTimeLimit),MessageFormat.format('EXPIREDAY={0}',licenseLimit), //日期采用yyyy-MM-dd日期格式MessageFormat.format('MACHINECODE={0}',machineCode),'' }; //將lic內容進行混合簽名并寫入內容 StringBuilder sign = new StringBuilder(); for(String item:liccontent){ sign.append(item+'yblog'); } liccontent[5] = MessageFormat.format('LICENSESIGN={0}',Encrpt.GetMD5Code(sign.toString())); FileUtil.createFileAndWriteLines(licensePath,liccontent); //將寫入的內容整體加密替換 String filecontent =FileUtil.readFileToString(licensePath); String encrptfilecontent = Encrpt.EncriptWRSA_Pri(filecontent,priavateKeyPath); File file = new File(licensePath); file.delete(); FileUtil.createFile(licensePath,encrptfilecontent); }

這里我們是將一些信息與特定標識進行拼接然后加密,使用的是RSA加密,我們使用私鑰加密公鑰解密,保證驗證的開放性與生成證書的私密性,密鑰可以使用java自帶的keytool工具進行生成,

教程地址:http://note.youdao.com/noteshare?id=09e2bfc902b21a335a4505f7946a45c9

在lic文件最后我們加上一個LICENSESIGN參數,對其他信息進行一次加密,防止信息被篡改,生成文件后再對文本進行整體加密

這里生成密鑰的長度為2048而非1024,所以解密塊長度為256,這里需要注意下,公鑰加密方法為,為了方便大家,這里提供下具體加密代碼

private static final int MAX_ENCRYPT_BLOCK = 117;private static final int MAX_DECRYPT_BLOCK=256; public static String EncriptWRSA_Pri(String data,String path) throws Exception{ String encryptData =''; FileInputStream in = new FileInputStream(path); KeyStore ks = KeyStore.getInstance('JKS');// JKS: Java KeyStoreJKS,可以有多種類型 ks.load(in, '123'.toCharArray()); in.close(); String alias = 'yblogkey'; // 記錄的別名 String pswd = '123'; // 記錄的訪問密碼 java.security.cert.Certificate cert = ks.getCertificate(alias); //獲取私鑰 PrivateKey privateKey = (PrivateKey) ks.getKey(alias, pswd.toCharArray()); //私鑰加密 Cipher cipher = Cipher.getInstance('rsa'); SecureRandom random = new SecureRandom(); cipher.init(Cipher.ENCRYPT_MODE, privateKey, random); try { // Cipher cipher = Cipher.getInstance('RSA'); // cipher.init(Cipher.ENCRYPT_MODE, publicKey); int length = data.getBytes().length; int offset = 0; byte[] cache; ByteArrayOutputStream outStream = new ByteArrayOutputStream(); int i = 0; while(length - offset > 0){if(length - offset > MAX_ENCRYPT_BLOCK){ cache = cipher.doFinal(data.getBytes(), offset, MAX_ENCRYPT_BLOCK);}else{ cache = cipher.doFinal(data.getBytes(), offset, length - offset);}outStream.write(cache, 0, cache.length);i++;offset = i * MAX_ENCRYPT_BLOCK; } return encode.encode(outStream.toByteArray()); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return encryptData; } public static String DecriptWithRSA_Pub(String data,String path) throws Exception{ X509Certificate x509Certificate = (X509Certificate) getCertificate(path); // 獲得公鑰 PublicKey publicKey = x509Certificate.getPublicKey(); Cipher cipher = Cipher.getInstance('rsa'); SecureRandom random = new SecureRandom(); byte[] bEncrypt = decoder.decodeBuffer(data); //公鑰解密 cipher.init(Cipher.DECRYPT_MODE, publicKey, random); String decryptData = ''; // byte[] plainData = cipher.doFinal(bEncrypt); // System.out.println('11111:'+new String(plainData)); int inputLen = bEncrypt.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(bEncrypt, offSet, MAX_DECRYPT_BLOCK); } else {cache = cipher.doFinal(bEncrypt, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * MAX_DECRYPT_BLOCK; } byte[] decryptedData = out.toByteArray(); out.close(); return new String(decryptedData); }

3.驗證lic

我們會在系統中注冊一個攔截器,未通過系統授權認證會自動跳轉到lic文件上傳界面,springboot接收文件與常規java有一些不同,使用的MultipartFile對象,會獲取到上傳文件的數組,進行操作,看下保存上傳lic文件代碼

@RequestMapping(value='/login/licenseauth',method= RequestMethod.POST) @ResponseBody public Map<Object,Object> licenseauth(MultipartHttpServletRequest multiReq){ Map<Object,Object> map = new HashMap<Object,Object>(); try { String savePath = ResourceUtils.getURL('src/main/resources/static/lic').getPath(); MultipartFile file = multiReq.getFile('file'); String filename = file.getOriginalFilename(); File uploadfile = new File(savePath + '' + filename); if (!uploadfile.exists()){//獲取item中的上傳文件的輸入流InputStream in = file.getInputStream();//創建一個文件輸出流FileOutputStream out = new FileOutputStream(savePath + '' + filename);//創建一個緩沖區byte buffer[] = new byte[1024];//判斷輸入流中的數據是否已經讀完的標識int len = 0;//循環將輸入流讀入到緩沖區當中,(len=in.read(buffer))>0就表示in里面還有數據while((len=in.read(buffer))>0){ //使用FileOutputStream輸出流將緩沖區的數據寫入到指定的目錄(savePath + '' + filename)當中 out.write(buffer, 0, len);}//關閉輸入流in.close();//關閉輸出流out.close(); } map.put('executestatus','1'); }catch (Exception e){ e.printStackTrace(); map.put('executestatus','0'); } return map; }

有了上傳文件,我們就可以通過系統內置的公鑰對lic文件的機器碼,授權時間進行驗證,確定是否能正常訪問系統

public static boolean authLicense() throws Exception{ boolean isauth = false; String pubkpath = ResourceUtils.getURL('src/main/resources/static/lic/').getPath()+'yblog.crt'; String licpath = ResourceUtils.getURL('src/main/resources/static/lic/').getPath(); File lic = new File(licpath); String[] filelist = lic.list(); if (filelist.length>0){ for (int i = 0; i < filelist.length; i++) {if (filelist[i].contains('.lic')){ File readfile = new File(licpath + filelist[i]); if (readfile.isFile()) { String liccontent = FileUtil.readFileToString(readfile); String decriptliccontent = Encrpt.DecriptWithRSA_Pub(liccontent,pubkpath); HashMap<String, String> props = genDataFromArrayByte(decriptliccontent.getBytes()); String licenseid = props.get('LICENSEID'); String licensename= props.get('LICENSENAME'); String licensetype = props.get('LICENSETYPE'); String liclimit = props.get('EXPIREDAY'); String machinecode = props.get('MACHINECODE'); String lincensesign = props.get('LICENSESIGN'); //驗證簽名 String allinfogroup = 'LICENSEID='+licenseid+'yblog'+'LICENSENAME='+licensename+'yblog'+'LICENSETYPE='+licensetype+'yblog'+'EXPIREDAY='+liclimit+'yblog'+'MACHINECODE='+machinecode+'yblogyblog'; if (lincensesign.equals(Encrpt.GetMD5Code(allinfogroup))){ //驗證機器碼 if (getMachineCode().equals(machinecode)){SimpleDateFormat sdf=new SimpleDateFormat('yyyy-MM-dd');Date bt=new Date();Date et=sdf.parse(liclimit);//驗證時間if(bt.compareTo(et)<=0){ isauth = true; System.out.println('注冊文件:'+filelist[i]+',已通過驗證'); break;}else{ System.out.println('證書過期');} }else{System.out.println('機器碼不一致'); } }else{ System.out.println('簽名不一致'); } }} } }else{ System.out.println('未上傳證書'); } return isauth; }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 小型玉石雕刻机_家用玉雕机_小型万能雕刻机_凡刻雕刻机官网 | 橡胶膜片,夹布膜片,橡胶隔膜密封,泵阀设备密封膜片-衡水汉丰橡塑科技公司网站 | PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 | 德州网站开发定制-小程序开发制作-APP软件开发-「两山开发」 | 防火窗_耐火窗_防火门厂家_防火卷帘门-重庆三乐门业有限公司 | 退火炉,燃气退火炉,燃气热处理炉生产厂家-丹阳市丰泰工业炉有限公司 | 创富网-B2B网站|供求信息网|b2b平台|专业电子商务网站 | 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 深圳货架厂_仓库货架公司_重型仓储货架_线棒货架批发-深圳市诺普泰仓储设备有限公司 | 展厅设计-展馆设计-专业企业展厅展馆设计公司-昆明华文创意 | 天津蒸汽/热水锅炉-电锅炉安装维修直销厂家-天津鑫淼暖通设备有限公司 | 电加热导热油炉-空气加热器-导热油加热器-翅片电加热管-科安达机械 | 捆扎机_气动捆扎机_钢带捆扎机-沈阳海鹞气动钢带捆扎机公司 | 高速龙门架厂家_监控杆_多功能灯杆_信号灯杆_锂电池太阳能路灯-鑫世源照明 | 砂尘试验箱_淋雨试验房_冰水冲击试验箱_IPX9K淋雨试验箱_广州岳信试验设备有限公司 | 安平县鑫川金属丝网制品有限公司,防风抑尘网,单峰防风抑尘,不锈钢防风抑尘网,铝板防风抑尘网,镀铝锌防风抑尘网 | 拉力测试机|材料拉伸试验机|电子拉力机价格|万能试验机厂家|苏州皖仪实验仪器有限公司 | 工控机-工业平板电脑-研华工控机-研越无风扇嵌入式box工控机 | Jaeaiot捷易科技-英伟达AI显卡模组/GPU整机服务器供应商 | 滚筒烘干机_转筒烘干机_滚筒干燥机_转筒干燥机_回转烘干机_回转干燥机-设备生产厂家 | 锂离子电池厂家-山东中信迪生电源 | 全自动五线打端沾锡机,全自动裁线剥皮双头沾锡机,全自动尼龙扎带机-东莞市海文能机械设备有限公司 | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | 断桥铝破碎机_铝合金破碎机_废铁金属破碎机-河南鑫世昌机械制造有限公司 | 圆形振动筛_圆筛_旋振筛_三次元振动筛-河南新乡德诚生产厂家 | 辽宁资质代办_辽宁建筑资质办理_辽宁建筑资质延期升级_辽宁中杭资质代办 | 沥青车辙成型机-车托式混凝土取芯机-混凝土塑料试模|鑫高仪器 | 磁棒电感生产厂家-电感器厂家-电感定制-贴片功率电感供应商-棒形电感生产厂家-苏州谷景电子有限公司 | 智能电表|预付费ic卡水电表|nb智能无线远传载波电表-福建百悦信息科技有限公司 | 自动气象站_气象站监测设备_全自动气象站设备_雨量监测站-山东风途物联网 | 电子厂招聘_工厂招聘_普工招聘_小时工招聘信息平台-众立方招工网 | 骨密度检测仪_骨密度分析仪_骨密度仪_动脉硬化检测仪专业生产厂家【品源医疗】 | 电子元器件呆滞料_元器件临期库存清仓尾料_尾料优选现货采购处理交易商城 | 奇酷教育-Python培训|UI培训|WEB大前端培训|Unity3D培训|HTML5培训|人工智能培训|JAVA开发的教育品牌 | 高柔性拖链电缆-聚氨酯卷筒电缆-柔性屏蔽电缆厂家-玖泰电缆 | 聚丙烯酰胺_阴离子_阳离子「用量少」巩义亿腾厂家直销,售后无忧 聚合甘油__盐城市飞龙油脂有限公司 | 上海皓越真空设备有限公司官网-真空炉-真空热压烧结炉-sps放电等离子烧结炉 | 超细粉碎机|超微气流磨|气流分级机|粉体改性设备|超微粉碎设备-山东埃尔派粉碎机厂家 | ZHZ8耐压测试仪-上海胜绪电气有限公司 | 软启动器-上海能曼电气有限公司 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 |