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.   

转载于:https://www.cnblogs.com/lvdongjie/p/4267629.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.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)…