1. 现在很多J2EE应用都采用一个license文件来授权系统的使用,特别是在系统购买的早期,会提供有限制的license文件对系统进行限制,比如试用版有譬如IP、日期、最大用户数量的限制等。
  2. 而license控制的方法又有很多,目前比较流行,只要设计的好就很难破解的方法就是采用一对密匙(私匙加密公匙解密)来生成License文件中的Sinature签名内容,再通过Base64或Hex来进行编码。比如原BEA公司现在是Oracle公司的WebLogic就采用的是这种方法来设置License文件。
  3. 这里只进行一个比较简单的实现:
  4. 一共三个类:
  5. A.KeyGenerater类生成公钥私钥对
  6. B.Signaturer类使用私钥进行签名
  7. C.SignProvider类用公钥验证
  8. 公钥和私钥使用Base64加密Base64这个类很多地方都可以查到。
  9. KeyGenerater类:
  10. public class KeyGenerater {
  11. private byte[] priKey;
  12. private byte[] pubKey;
  13. public void generater() {
  14. try {
  15. KeyPairGenerator keygen = KeyPairGenerator .getInstance("RSA");
  16. SecureRandom secrand = new SecureRandom();
  17. secrand.setSeed("www.川江号子.cn".getBytes()); // 初始化随机产生器
  18. keygen.initialize(1024, secrand);
  19. KeyPair keys = keygen.genKeyPair();
  20. PublicKey pubkey = keys.getPublic();
  21. PrivateKey prikey = keys.getPrivate()
  22. pubKey = Base64.encodeToByte(pubkey.getEncoded());
  23. priKey = Base64.encodeToByte(prikey.getEncoded());
  24. System.out.println("pubKey = " + new String(pubKey));
  25. System.out.println("priKey = " + new String(priKey));
  26. } catch (java.lang.Exception e) {
  27. System.out.println("生成密钥对失败");
  28. e.printStackTrace();
  29. }
  30. }
  31. public byte[] getPriKey() {
  32. return priKey;
  33. }
  34. public byte[] getPubKey() {
  35. return pubKey;
  36. }
  37. }
  38. Signaturer 类:
  39. public class Signaturer {
  40. public static byte[] sign(byte[] priKeyText, String plainText) {
  41. try {
  42. PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(priKeyText));
  43. KeyFactory keyf = KeyFactory.getInstance("RSA");
  44. PrivateKey prikey = keyf.generatePrivate(priPKCS8);
  45. // 用私钥对信息生成数字签名
  46. Signature signet = java.security.Signature.getInstance("MD5withRSA");
  47. signet.initSign(prikey);
  48. signet.update(plainText.getBytes());
  49. byte[] signed = Base64.encodeToByte(signet.sign());
  50. return signed;
  51. } catch (java.lang.Exception e) {
  52. System.out.println("签名失败");
  53. e.printStackTrace();
  54. }
  55. return null;
  56. }
  57. }
  58. SignProvider 类:
  59. public class SignProvider {
  60. private SignProvider() {
  61. }
  62. public static boolean verify(byte[] pubKeyText, String plainText,
  63. byte[] signText) {
  64. try {
  65. // 解密由base64编码的公钥,并构造X509EncodedKeySpec对象
  66. X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(Base64.decode(pubKeyText));
  67. // RSA对称加密算法
  68. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  69. // 取公钥匙对象
  70. PublicKey pubKey = keyFactory.generatePublic(bobPubKeySpec);
  71. // 解密由base64编码的数字签名
  72. byte[] signed = Base64.decode(signText);
  73. Signature signatureChecker = Signature.getInstance("MD5withRSA");
  74. signatureChecker.initVerify(pubKey);
  75. signatureChecker.update(plainText.getBytes());
  76. // 验证签名是否正常
  77. if (signatureChecker.verify(signed))
  78. return true;
  79. else
  80. return false;
  81. } catch (Throwable e) {
  82. System.out.println("校验签名失败");
  83. e.printStackTrace();
  84. return false;
  85. }
  86. }
  87. }

license文件生成原理的更多相关文章

  1. 用php生成一个excel文件(原理)

    1.我们用php来生成一个excel文档来讲述其原理: excel2007里面的文档目录组成部分为: 2.我们使用ZipArchive()方法来生成一个简易的excel文件. 使用方法: 3.代码如下 ...

  2. Java提高篇——JVM加载class文件的原理机制

    在面试java工程师的时候,这道题经常被问到,故需特别注意. 1.JVM 简介 JVM 是我们Javaer 的最基本功底了,刚开始学Java 的时候,一般都是从“Hello World ”开始的,然后 ...

  3. 软硬链接、文件删除原理、linux中的三种时间、chkconfig优化

    第1章 软硬链接 1.1 硬链接 1.1.1 含义 多个文件拥有相同的inode号码 硬链接即文件的多个入口 1.1.2 作用 防止你误删除文件 1.1.3 如何创建硬链接 ln 命令,前面是源文件  ...

  4. phpcms模板生成原理

    phpcms模板生成原理2009-09-25 16:14PHPCMS是功能强大的网站管理系统.以后有时间,俺要将其管理.使用.再开发等等都理顺出来.这一篇短文先介绍PHPCMS的模板机制. 所谓网站模 ...

  5. 【Unity游戏开发】tolua之wrap文件的原理与使用

    本文内容转载自:https://www.cnblogs.com/blueberryzzz/p/9672342.html .非常感谢原作者慷慨地授权转载,比心!@blueberryzzz 是位大神,欢迎 ...

  6. tolua之wrap文件的原理与使用

    什么是wrap文件 每个wrap文件都是对一个c#类的包装,在lua中,通过对wrap类中的函数调用,间接的对c#实例进行操作. wrap类文件生成和使用的总体流程 生成一个wrap文件的流程 这部分 ...

  7. 【转载】tolua之wrap文件的原理与使用

    什么是wrap文件 每个wrap文件都是对一个c#类的包装,在lua中,通过对wrap类中的函数调用,间接的对c#实例进行操作. wrap类文件生成和使用的总体流程 生成一个wrap文件的流程 这部分 ...

  8. JVM加载class文件的原理机制(转)

    JVM加载class文件的原理机制 1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中 2.java中的 ...

  9. FastDFS分布式文件系统设计原理

    转载自http://blog.chinaunix.net/uid-20196318-id-4058561.html FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker ser ...

随机推荐

  1. 记一次T-SQL查询优化 索引的重要性

    概述 在一次调优一个项目组件的性能问题时,发现SQL的设计真的是非常的重要,所以写一篇博文来记录总结一下. 环境介绍 这个项目组件是一个Window服务,内部在使用轮循机会在处理一个事件表中的事件,将 ...

  2. Tomcat:Can't load IA 32-bit .dll on a AMD 64-bit platform问题的解决

    控制台错误如下: java.lang.UnsatisfiedLinkError: D:\apache-tomcat-7.0.56\bin\tcnative-1.dll: Can't load IA 3 ...

  3. Objective-C学习篇08—NSDictionary与NSSet

    NSDictionary与NSMutableDictionary NSSet与NSMutableSte 字典 字典:字典分为可变字典NSDictionary和不可变字典NSMutableDiction ...

  4. windows下安装apache笔记

    之前一直是用别人配置好的apache环境来开放,今天想自己安装配置下windows下的apache(nginx+fastcgi).mysql.php等. 虽然大部分时间是在搞前端开发,偶尔也要搞服务端 ...

  5. C#中英文混合字符串过长截断

    /// <summary> /// 截断字符串 /// </summary> /// <param name="maxLength">最大长度& ...

  6. [转]extern,static存储空间矛盾

    其实,这两个语句的位置不同,会出现不同的解释.这主要是由于 static 具有的两重意义所导致的: (1) 如果 static int foo; 这一句位于函数中,则 static 表示的是存储属性, ...

  7. javascript 版的 SuperMario

    注册博客园4年了,还没发表过一篇文章.明年就是超级马里奥这款游戏诞生30周年了,作为一个喜欢2d卷轴游戏的玩家,决定用js实现一个.目前只实现了基本玩法,得分什么的也还没做.项目的GitHub的地址是 ...

  8. 神舟飞船上的计算机使用什么操作系统,为什么是自研发不是 Linux?

    中国航天用的SpaceOS主要内容是仿造美国风河系统公司的VxWorks653(653是产品名,并非版本号). 先解释为什么用这个系统不用Linux: 航天器的内存和CPU都非常弱,弱到什么程度呢:天 ...

  9. YII增加全局函数

    法1: 在使用Yii开发中我们经常会遇到一个问题,每次使用Yii的组件.扩展等,我们会像下面一样去写: <?php Yii::app()->user; Yii::app()->get ...

  10. Windows登录脚本可以限制并发登录吗

    在Windows服务器中,使用一个Windows登录脚本来限制并发会话靠谱吗? 事实上,这种解决方案存在很多缺点和弱点,并不能满足大中型IT基础设施的安全性需求. 一.使用登陆脚本限制并发会话,恶意用 ...