license文件生成原理

byte解密weblogic加密oraclehex
  1. 現在很多J2EE應用都采用一個license文件來授權系統的使用,特別是在系統購買的早期,會提供有限制的license文件對系統進行限制,比如試用版有譬如IP、日期、最大用戶數量的限制等。??
  2. ??
  3. license控制的方法又有很多,目前比較流行,只要設計的好就很難破解的方法就是采用一對密匙(私匙加密公匙解密)來生成License文件中的Sinature簽名內容,再通過Base64或Hex來進行編碼。比如原BEA公司現在是Oracle公司的WebLogic就采用的是這種方法來設置License文件。??
  4. ??
  5. 這里只進行一個比較簡單的實現:??
  6. ??
  7. 一共三個類:??
  8. ??
  9. A.KeyGenerater類生成公鑰私鑰對??
  10. ??
  11. B.Signaturer類使用私鑰進行簽名??
  12. ??
  13. C.SignProvider類用公鑰驗證??
  14. ??
  15. 公鑰和私鑰使用Base64加密Base64這個類很多地方都可以查到。??
  16. ??
  17. ???
  18. ??
  19. KeyGenerater類:??
  20. ??
  21. ???
  22. ??
  23. public?class?KeyGenerater?{???
  24. ??
  25. ?private?byte[]?priKey;???
  26. ??
  27. ?private?byte[]?pubKey;???
  28. ??
  29. ?public?void?generater()?{???
  30. ??try?{???
  31. ??
  32. ??KeyPairGenerator?keygen?=?KeyPairGenerator?.getInstance("RSA");???
  33. ??
  34. ???SecureRandom?secrand?=?new?SecureRandom();???
  35. ??
  36. ???secrand.setSeed("www.川江號子.cn".getBytes());?//?初始化隨機產生器???
  37. ??
  38. ???keygen.initialize(1024,?secrand);???
  39. ??
  40. ???KeyPair?keys?=?keygen.genKeyPair();???
  41. ??
  42. ???PublicKey?pubkey?=?keys.getPublic();???
  43. ??
  44. ???PrivateKey?prikey?=?keys.getPrivate()???
  45. ??
  46. ???pubKey?=?Base64.encodeToByte(pubkey.getEncoded());???
  47. ??
  48. ???priKey?=?Base64.encodeToByte(prikey.getEncoded());???
  49. ??
  50. ???System.out.println("pubKey?=?"?+?new?String(pubKey));???
  51. ??
  52. ???System.out.println("priKey?=?"?+?new?String(priKey));???
  53. ??
  54. ??}?catch?(java.lang.Exception?e)?{???
  55. ??
  56. ???System.out.println("生成密鑰對失敗");???
  57. ??
  58. ???e.printStackTrace();???
  59. ??
  60. ??}???
  61. ??
  62. ?}???
  63. ??
  64. ?public?byte[]?getPriKey()?{???
  65. ??
  66. ??return?priKey;???
  67. ??
  68. ?}???
  69. ??
  70. ?public?byte[]?getPubKey()?{???
  71. ??
  72. ??return?pubKey;???
  73. ??
  74. ?}???
  75. ??
  76. }??
  77. ???
  78. ??
  79. Signaturer?類:????
  80. ??
  81. ???
  82. ??
  83. public?class?Signaturer?{???
  84. ??
  85. ?public?static?byte[]?sign(byte[]?priKeyText,?String?plainText)?{???
  86. ??
  87. ??try?{???
  88. ??
  89. ???PKCS8EncodedKeySpec?priPKCS8?=?new?PKCS8EncodedKeySpec(Base64.decode(priKeyText));???
  90. ??
  91. ???KeyFactory?keyf?=?KeyFactory.getInstance("RSA");???
  92. ??
  93. ???PrivateKey?prikey?=?keyf.generatePrivate(priPKCS8);???
  94. ??
  95. ???//?用私鑰對信息生成數字簽名???
  96. ??
  97. ????Signature?signet?=?java.security.Signature.getInstance("MD5withRSA");???
  98. ??
  99. ???signet.initSign(prikey);???
  100. ??
  101. ???signet.update(plainText.getBytes());???
  102. ??
  103. ???byte[]?signed?=?Base64.encodeToByte(signet.sign());???
  104. ??
  105. ???return?signed;???
  106. ??
  107. ??}?catch?(java.lang.Exception?e)?{???
  108. ??
  109. ???System.out.println("簽名失敗");???
  110. ??
  111. ???e.printStackTrace();???
  112. ??
  113. ??}???
  114. ??
  115. ??return?null;???
  116. ??
  117. ?}???
  118. ??
  119. }???
  120. ??
  121. ??
  122. ?SignProvider?類:??
  123. ??
  124. public?class?SignProvider?{???
  125. ??
  126. ?private?SignProvider()?{???
  127. ??
  128. ?}???
  129. ??
  130. ?public?static?boolean?verify(byte[]?pubKeyText,?String?plainText,???
  131. ??
  132. ???byte[]?signText)?{???
  133. ??
  134. ??try?{???
  135. ??
  136. ???//?解密由base64編碼的公鑰,并構造X509EncodedKeySpec對象???
  137. ??
  138. ???X509EncodedKeySpec?bobPubKeySpec?=?new?X509EncodedKeySpec(Base64.decode(pubKeyText));???
  139. ??
  140. ???//?RSA對稱加密算法???
  141. ??
  142. ???KeyFactory?keyFactory?=?KeyFactory.getInstance("RSA");???
  143. ??
  144. ???//?取公鑰匙對象???
  145. ??
  146. ???PublicKey?pubKey?=?keyFactory.generatePublic(bobPubKeySpec);???
  147. ??
  148. ???//?解密由base64編碼的數字簽名???
  149. ??
  150. ???byte[]?signed?=?Base64.decode(signText);???
  151. ??
  152. ???Signature?signatureChecker?=?Signature.getInstance("MD5withRSA");???
  153. ??
  154. ???signatureChecker.initVerify(pubKey);???
  155. ??
  156. ???signatureChecker.update(plainText.getBytes());???
  157. ??
  158. ???//?驗證簽名是否正常???
  159. ??
  160. ???if?(signatureChecker.verify(signed))???
  161. ??
  162. ????return?true;???
  163. ??
  164. ???else???
  165. ??
  166. ????return?false;???
  167. ??
  168. ??}?catch?(Throwable?e)?{???
  169. ??
  170. ???System.out.println("校驗簽名失敗");???
  171. ??
  172. ???e.printStackTrace();???
  173. ??
  174. ???return?false;???
  175. ??
  176. ??}???
  177. ??
  178. ?}???
  179. ??
  180. }?

轉載于:https://www.cnblogs.com/lvdongjie/p/4267629.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273411.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273411.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273411.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux常用關機命令及其區別-Shutdown halt reboot init

1.shutdown shutdown命令安全地將系統關機。 shutdown 參數說明: [-t] 在改變到其它runlevel之前﹐告訴init多久以后關機。 [-r] 重啟計算器。 [-k] 并不真正關機﹐只是送警告信號給每位登錄者〔login〕。 [-h] 關機后關閉電源〔halt〕。 [-n] 不用init﹐而是自己來關機。不鼓…

CSS3動畫@keyframes中translate和scale混用出錯問題

在寫基于網頁的2048時,想讓一個元素出現時已經通過translate屬性固定在指定位置,同時顯示動畫scale(0)-->scale(1),以實現放大出現效果。 CSS代碼為 -webkit-keyframes mymove_failed{0% {-webkit-transform:translate(50px,50px) scale…

metero學習

博客園首頁新隨筆聯系訂閱管理最新隨筆 最新評論 node.js相關的中文文檔及教程 (轉) Posted on 2013-08-30 10:40 小小清清 閱讀(61) 評論(0) 編輯 收藏 node.js api中英文對照: http://docs.cnodejs.net/cman/ node.js入門中文版: http://nodebeginner.org/index-zh-cn.html e…

Linux統計單個文件統計

語法:wc [選項] 文件… 說明:該命令統計給定文件中的字節數、字數、行數。如果沒有給出文件名,則從標準輸入讀取。wc同時也給出所有指定文件的總統計數。字是由空格字符區分開的最大字符串。 該命令各選項含義如下: - c 統計字節數…

jQuery慢慢啃之事件對象(十一)

1.event.currentTarget//在事件冒泡階段中的當前DOM元素 $("p").click(function(event) {alert( event.currentTarget this ); // true }); 2.event.data//當前執行的處理器被綁定的時候,包含可選的數據傳遞給jQuery.fn.bind。 $("a").ea…

Linuxcurl命令參數詳解

Linuxcurl是通過url語法在命令行下上傳或下載文件的工具軟件,它支持http,https,ftp,ftps,telnet等多種協議,常被用來抓取網頁和監控Web服務器狀態。1.linuxcurl抓取網頁:抓取百度:curlhttp://www.baidu.com如發現亂碼,…

android解析XML總結(SAX、Pull、Dom三種方式)

在android開發中&#xff0c;經常用到去解析xml文件&#xff0c;常見的解析xml的方式有一下三種&#xff1a;SAX、Pull、Dom解析方式。 今天解析的xml示例&#xff08;channels.xml&#xff09;如下&#xff1a; 1 <?xml version"1.0" encoding"utf-8"…

查看Eclipse中的jar包的源代碼:jd-gui.exe

前面搞了很久的使用JAD&#xff0c;各種下載插件&#xff0c;最后配置好了&#xff0c;還是不能用&#xff0c;不知道怎么回事&#xff0c; 想起一起用過的jd-gui.exe這個工具&#xff0c;是各種強大啊&#xff01;&#xff01;&#xff01; 只需要把jar包直接扔進去就可以了&a…

maven scope含義的說明

compile &#xff08;編譯范圍&#xff09; compile是默認的范圍&#xff1b;如果沒有提供一個范圍&#xff0c;那該依賴的范圍就是編譯范圍。編譯范圍依賴在所有的classpath 中可用&#xff0c;同時它們也會被打包。 provided &#xff08;已提供范圍&#xff09; provided 依…

此地址使用了一個通常用于網絡瀏覽以外的端口。出于安全原因,Firefox 取消了該請求...

FirFox打開80以外的端口&#xff0c;會彈出以下提示&#xff1a; “此地址使用了一個通常用于網絡瀏覽以外的端口。出于安全原因&#xff0c;Firefox 取消了該請求。”。 解決方法如下&#xff1a; 在Firefox地址欄輸入about:config,然后在右鍵新建一個字符串鍵network.securit…

Java操作shell腳本

public class Exec {private static ILogger logger LoggerFactory.getLogger(Exec.class);public Exec() {super();}/*** 執行命令&#xff08;如Shell腳本&#xff09;<br>* * param cmd 操作命令* param timeout 超時時間* return 命令執行過程輸出內容* * throws IO…

Mysql更新插入

在向表中插入數據的時候&#xff0c;經常遇到這樣的情況&#xff1a;1. 首先判斷數據是否存在&#xff1b; 2. 如果不存在&#xff0c;則插入&#xff1b;3.如果存在&#xff0c;則更新。 在 SQL Server 中可以這樣處理&#xff1a; if not exists (select 1 from t where id …

信息加密之信息摘要加密MD2、MD4、MD5

對于用戶數據的保密一直是各個互聯網企業頭疼的事&#xff0c;那如何防止用戶的個人信息泄露呢&#xff1f;今天為大家介紹一種最簡單的加密方式--信息摘要算法MD。它如何來保護用戶的個人信息呢&#xff1f;其實很簡單&#xff0c;當獲得到用戶的信息后&#xff0c;先對其進行…

Java 從網絡上下載文件

/*** 下載文件到本地 */public static void downloadPicture(String imageUrl, String filename){ URL url;try {url new URL(imageUrl);//打開網絡輸入流DataInputStream dis new DataInputStream(url.openStream());//建立一個新的文件FileOutputStream fos new FileOutp…

An error was encountered while running(Domain=LaunchSerivcesError, Code=0)

今天突然遇到這樣一個錯誤&#xff0c;編譯可以通過&#xff0c;但是運行就會彈出這個錯誤提示&#xff1a; An error was encountered while running(DomainLaunchSerivcesError, Code0) 解決辦法就是重置模擬器。 點擊模擬器菜單中的Reset Contents and Settings&#xff0c;…

hdu 4091 線性規劃

分析轉自&#xff1a;http://blog.csdn.net/dongdongzhang_/article/details/7955136 題意 &#xff1a; 背包能裝體積為N, 有兩種寶石&#xff0c; 數量無限&#xff0c; 不能切割。 分別為 size1 value 1 size2 value2 問背包能裝最大的價值&#xff1f; 思路 &#xff…

linux fmt命令

簡單的格式化文本 fmt [option] [file-list] fmt通過將所有非空白行的長度設置為幾乎相同&#xff0c;來進行簡單的文本格式化 參數 fmt從file-list中讀取文件&#xff0c;并將其內容的格式化版本發送到標準輸出。如果不制定文件名或者用連字符&#xff08;-&#xff09;來替代…

基于 jQuery支持移動觸摸設備的Lightbox插件

Swipebox是一款支持桌面、移動觸摸手機和平板電腦的jquery Lightbox插件。該lightbox插件支持手機的觸摸手勢&#xff0c;支持桌面電腦的鍵盤導航&#xff0c;并且支持視頻的播放。 在線預覽 源碼下載 簡要教程 Swipebox是一款支持桌面、移動觸摸手機和平板電腦的jQuery Ligh…

簡化工作——我的bat文件

重啟adb(radb.bat)&#xff1a; echo off call adb kill-server call adb start-server call adb remount push 一個apk(push.bat) echo off if "%1""launcher" ( call adb push 相關apk路徑 system/app )else ( echo 請添加一個參數!當前有效…

js操作數據庫

<script languagejavascript> function replace(v) { //容錯問題&#xff0c;請讀者自行進行判斷。 //定義SQL語句 var sql select * from Dictionary where MainID v ; //新建數據庫連接對象和數據集存取對象 var ConnDB new ActiveXObject(adodb.connection)…