日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Springboot如何實(shí)現(xiàn)Web系統(tǒng)License授權(quán)認(rèn)證

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

在我們做系統(tǒng)級(jí)框架的時(shí)候,我們要一定程度上考慮系統(tǒng)的使用版權(quán),不能隨便一個(gè)人拿去在任何環(huán)境都能用,所以我們需要給我們系統(tǒng)做一個(gè)授權(quán)認(rèn)證機(jī)制,只有上傳了我們下發(fā)的lic文件并驗(yàn)證通過,才能正常使用,下面就開始一步一步實(shí)現(xiàn)這個(gè)功能

1.生成機(jī)器碼

我們首先要做的就是對(duì)軟件部署的環(huán)境的唯一性進(jìn)行限制,這里使用的是macadderss,當(dāng)然你也可以換成cpu序列編號(hào),并無太大影響,先上代碼

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); }

這里進(jìn)行的操作是取出機(jī)器碼,與java版本,jvm,操作系統(tǒng)參數(shù)進(jìn)行混合,并進(jìn)行MD5操作

2.進(jìn)行l(wèi)ic文件的生成

Springboot如何實(shí)現(xiàn)Web系統(tǒng)License授權(quán)認(rèn)證

Springboot如何實(shí)現(xiàn)Web系統(tǒng)License授權(quán)認(rèn)證

這是我生成證書與進(jìn)行授權(quán)證書的界面,可以看到授權(quán)證書主要包含三個(gè)要素,機(jī)器碼,是否永久有效標(biāo)識(shí),證書時(shí)效,我們會(huì)將這些數(shù)據(jù)寫入文本中并進(jìn)行加密處理,看下生成證書的代碼

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內(nèi)容進(jìn)行混合簽名并寫入內(nèi)容 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); //將寫入的內(nèi)容整體加密替換 String filecontent =FileUtil.readFileToString(licensePath); String encrptfilecontent = Encrpt.EncriptWRSA_Pri(filecontent,priavateKeyPath); File file = new File(licensePath); file.delete(); FileUtil.createFile(licensePath,encrptfilecontent); }

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

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

在lic文件最后我們加上一個(gè)LICENSESIGN參數(shù),對(duì)其他信息進(jìn)行一次加密,防止信息被篡改,生成文件后再對(duì)文本進(jìn)行整體加密

這里生成密鑰的長(zhǎng)度為2048而非1024,所以解密塊長(zhǎng)度為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; // 對(duì)數(shù)據(jù)分段解密 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.驗(yàn)證lic

我們會(huì)在系統(tǒng)中注冊(cè)一個(gè)攔截器,未通過系統(tǒng)授權(quán)認(rèn)證會(huì)自動(dòng)跳轉(zhuǎn)到lic文件上傳界面,springboot接收文件與常規(guī)java有一些不同,使用的MultipartFile對(duì)象,會(huì)獲取到上傳文件的數(shù)組,進(jìn)行操作,看下保存上傳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();//創(chuàng)建一個(gè)文件輸出流FileOutputStream out = new FileOutputStream(savePath + '' + filename);//創(chuàng)建一個(gè)緩沖區(qū)byte buffer[] = new byte[1024];//判斷輸入流中的數(shù)據(jù)是否已經(jīng)讀完的標(biāo)識(shí)int len = 0;//循環(huán)將輸入流讀入到緩沖區(qū)當(dāng)中,(len=in.read(buffer))>0就表示in里面還有數(shù)據(jù)while((len=in.read(buffer))>0){ //使用FileOutputStream輸出流將緩沖區(qū)的數(shù)據(jù)寫入到指定的目錄(savePath + '' + filename)當(dāng)中 out.write(buffer, 0, len);}//關(guān)閉輸入流in.close();//關(guān)閉輸出流out.close(); } map.put('executestatus','1'); }catch (Exception e){ e.printStackTrace(); map.put('executestatus','0'); } return map; }

有了上傳文件,我們就可以通過系統(tǒng)內(nèi)置的公鑰對(duì)lic文件的機(jī)器碼,授權(quán)時(shí)間進(jìn)行驗(yàn)證,確定是否能正常訪問系統(tǒng)

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'); //驗(yàn)證簽名 String allinfogroup = 'LICENSEID='+licenseid+'yblog'+'LICENSENAME='+licensename+'yblog'+'LICENSETYPE='+licensetype+'yblog'+'EXPIREDAY='+liclimit+'yblog'+'MACHINECODE='+machinecode+'yblogyblog'; if (lincensesign.equals(Encrpt.GetMD5Code(allinfogroup))){ //驗(yàn)證機(jī)器碼 if (getMachineCode().equals(machinecode)){SimpleDateFormat sdf=new SimpleDateFormat('yyyy-MM-dd');Date bt=new Date();Date et=sdf.parse(liclimit);//驗(yàn)證時(shí)間if(bt.compareTo(et)<=0){ isauth = true; System.out.println('注冊(cè)文件:'+filelist[i]+',已通過驗(yàn)證'); break;}else{ System.out.println('證書過期');} }else{System.out.println('機(jī)器碼不一致'); } }else{ System.out.println('簽名不一致'); } }} } }else{ System.out.println('未上傳證書'); } return isauth; }

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美一级二区| 久久在线免费| 黄色欧美在线| 日韩精品高清不卡| 午夜电影亚洲| 久久精品免费一区二区三区 | 欧美日韩免费看片| 另类av一区二区| 国产一区二区三区成人欧美日韩在线观看 | 亚洲欧美专区| 玖玖玖国产精品| 免费不卡中文字幕在线| 婷婷激情一区| аⅴ资源天堂资源库在线| 精品视频黄色| 久久精品福利| 欧美久久天堂| 91亚洲成人| 国产成人精品福利| 日本不卡一区二区三区| 国产综合亚洲精品一区二| 亚洲国产成人二区| 美女国产一区二区三区| 精品九九在线| 亚洲v在线看| 亚洲三区欧美一区国产二区| 99精品综合| 欧美肉体xxxx裸体137大胆| 国产高潮在线| 久久精品高清| 国产在线|日韩| 麻豆精品蜜桃| 蜜桃av一区二区| 亚洲欧洲一区二区天堂久久| 日韩视频一区| 欧美日本精品| 香蕉成人av| 亚洲色图综合| 精品三级在线观看视频| 99精品在线观看| 日本国产一区| 日韩一区亚洲二区| 三级欧美在线一区| 国产激情久久| 久久精品青草| 免费视频一区二区| 精品视频网站| 久久国产66| 欧美黑人巨大videos精品| 欧美精品日日操| 婷婷久久免费视频| 麻豆理论在线观看| 日韩精品视频网站| 偷拍欧美精品| 免费在线欧美黄色| 久久激情五月激情| 国产精品主播| 精品国产亚洲一区二区在线观看| 石原莉奈一区二区三区在线观看| 国产精品毛片一区二区三区| 国产精品毛片久久久| 久久精品国产99久久| 国产色99精品9i| 国产精品99一区二区| 亚洲精品影院在线观看| 欧美日韩国产v| 国产精品**亚洲精品| 亚洲一区欧美激情| 久久精品国产68国产精品亚洲| 国产精品4hu.www| 日本不卡不码高清免费观看| 欧美~级网站不卡| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 亚洲一区二区三区免费在线观看| 精品一区二区三区视频在线播放| 亚洲aa在线| 久久xxxx精品视频| 久久久夜夜夜| 丁香六月综合| 国产精品一区二区三区四区在线观看| 性欧美69xoxoxoxo| 精品91久久久久| 红桃视频欧美| 国产精品毛片| 成人羞羞视频播放网站| 精品久久久中文字幕| 精品在线网站观看| 欧美精品中文| 国产综合亚洲精品一区二| 青青青免费在线视频| 国内揄拍国内精品久久| 欧美激情五月| 国产精品麻豆成人av电影艾秋| 视频精品一区| 99国产精品视频免费观看一公开 | 国产日韩免费| 国产精品尤物| 四虎成人av| 99精品网站| 亚洲精品在线影院| 国产精品av久久久久久麻豆网| 欧美国产91| 久久性天堂网| 亚洲精品人人| 国产精品亚洲产品| 精品免费视频| 久久久久国产| 免费看黄色91| 天堂va在线高清一区| 美日韩一区二区三区| 国产成人久久精品一区二区三区| 亚洲v在线看| 欧美综合精品| 999国产精品永久免费视频app| 日韩久久精品| 国产免费成人| 国产伦精品一区二区三区在线播放| 久久99青青| 黄色国产精品| 精品国产aⅴ| 天堂va蜜桃一区二区三区| 国产调教精品| 人在线成免费视频| 亚洲一区二区三区无吗| 国产美女久久| 亚洲黄色在线| 欧美精品导航| 欧美特黄一级大片| 蜜桃久久久久久久| 韩国一区二区三区视频| 免费精品视频在线| 久久久久国产一区二区| 中文字幕在线官网| 国产欧美在线观看免费| 女生影院久久| 91精品丝袜国产高跟在线| 欧美成人综合| 欧美国产小视频| 日韩中文字幕91| 日韩精品一卡| 精品一区二区三区中文字幕| 国产精品videosex极品| 久久一区欧美| 亚洲精品成人图区| 精品在线99| 伊人精品在线| 日韩av成人高清| 精品国产三区在线| 午夜欧美精品久久久久久久| 亚洲精品看片| 久久久久黄色| 亚洲一区二区三区免费在线观看| 日韩精品久久久久久久软件91| 久久国产乱子精品免费女| 日韩av专区| 欧美影院三区| 日韩国产欧美在线播放| 精品美女视频 | 爽好久久久欧美精品| 国产精品流白浆在线观看| 日韩欧美一区二区三区免费观看| 日韩视频网站在线观看| 亚洲午夜av| 鲁大师成人一区二区三区| 国产欧美69| 亚洲深夜av| 国产精品久一| 国产模特精品视频久久久久| 欧美亚洲色图校园春色| 日韩大片在线| 日韩福利视频一区| 久久精品国产68国产精品亚洲| 国产毛片久久久| 亚洲美洲欧洲综合国产一区| 精品免费av| 亚洲一区二区免费在线观看| 桃色av一区二区| 日韩精品视频一区二区三区| 日韩国产一区二区| 日韩精品久久久久久| 欧美日韩视频网站| 老牛国内精品亚洲成av人片| 蜜桃av一区二区三区电影| 国内亚洲精品| 午夜精品成人av| 欧美激情麻豆| 国产乱码精品一区二区三区四区| 黄色日韩在线| 亚洲三级欧美| 黄色精品视频| 久久精品国产免费| 国产日韩欧美一区二区三区在线观看 | 99国产精品久久久久久久| 精品三级久久| 日本午夜大片a在线观看| 国产成人精品一区二区免费看京| 国产伦精品一区二区三区在线播放 | 欧美影院视频| 亚洲资源在线| 久久高清精品|