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. php代码结尾不要添加结尾标记

    如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记.这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图.

  2. 武汉科技大学ACM:1004: 华科版C语言程序设计教程(第二版)习题5.6

    Problem Description 这天老师又给小豪出了一道题目:给你三根长度分别为a,b,c的火柴,让你计算这三跟火柴能组成的三角形的面积. Input 输入每行包括三个数a,b,c. Outp ...

  3. 武汉科技大学ACM :1006: 华科版C语言程序设计教程(第二版)习题7.15

    Problem Description 输入n个字符串(n<=100),输出其中最长的串,如果有多个则取最先找到的那一个. Input 多组测试数据. 每组测试数据第一行包含一个整数n,表示一共 ...

  4. CRT内存调试标记

    static unsigned char _bNoMansLandFill = 0xFD; /* fill no-man's land with this */ static unsigned cha ...

  5. 微信php接入设计案列

    <?php namespace Home\Controller; use Think\Controller; use Com\Wechat; use Com\WechatAuth; class ...

  6. 文成小盆友python-num13 整个堡垒机

    本节主要内容: 1.pymsql的使用 2.SQLAchemy使用 3.Paramiko 4.通过ORM功能使用和Paramiko的使用实现一个简单的堡垒机模型. 一.pymsql的使用 pymsql ...

  7. 《python基础教程》笔记之 其它语句1

    print 相关 print可以打印多个表达式,只要将它们用逗号隔开就好,结果中每个参数之间都会插入一个空格,使用+可以避免空格,如 >>> print 'age:',42age: ...

  8. 开发H5小游戏

    Egret白鹭H5小游戏开发入门(一)   前言: 好久没更新博客了,以前很多都不会,所以常常写博客总结,倒是现在有点点经验了就懒了.在过去的几个月里,在canvas游戏框架方面,撸过了CreateJ ...

  9. 遍历元素绑定事件时作用域是怎么回事啊,为什么要用this关键字,而直接使用元素本身就不行?

    如下代码,将this改为rows[i]为啥不起作用了 var rows = document.getElementsByTagName("tr"); for(var i=0;i&l ...

  10. ubuntu新建某个目录的快捷方式到桌面,有三种方法

    0. ln -sf /home/wjs ~/Desktop (wjs是我的登录用户名). 1. 在文件浏览器里 ,目录的右键有个make link 或 创建链接 ,然后cut or copy 到 桌面 ...