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. GDI+基础(3)

    常用图形绘制 <%@ Page ContentType="image/gif" Language="C#" %> <!--ContentTyp ...

  2. ArcMap - 使用python更新列中的值

    概述:在外文网上,很多人都问在ArcMap中如何通过SQL修改属性字段的值,我见回答的人都说通过"Field Calculator",貌似不能直接通过SQL语句. 虽然学gis开发 ...

  3. (Spring加载xml时)org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'.

    ApplicationContext ctx = new ClassPathXmlApplicationContext("test.xml");报错 在启动Spring时,报以下错 ...

  4. 杂记之web篇

    问题1:通过POST方式提交给后台的数据出现了乱码,用部分浏览器测试却是好的. 解决办法: 在web.config文件中加上 <globalization responseEncoding=&q ...

  5. windows下安装php笔记

    为了更深入的理解下服务端的配置 ,上篇文章讲了如何在windows下安装apache , 接下来再研究下在windows下安装php并且结合apache运行php环境, 纯属学习用 ^^ ,如果嫌麻烦 ...

  6. HDU 4614 (13年多校第二场1004)裸线段树

    题意:给你N个花瓶,编号是0  到 N - 1 ,初始状态花瓶是空的,每个花瓶最多插一朵花. 然后有2个操作. 操作1,a b c ,往在a位置后面(包括a)插b朵花,输出插入的首位置和末位置. 操作 ...

  7. Intellij idea 12和设置快捷键修改(加快项目的开发速度与养成良好习惯)

    1.为了养成良好的代码习惯idead中的javascript jSLint能显示不良的代码设置如下    2.Intellij idea 12每一次修改,保存生成都要按ctrl+shift+F9非常影 ...

  8. jQuery的map()与jQuery.map()总结

    请注意他们不是同一个函数.前者是jQuery对象的实例方法(即$.fn.map),后者是一个仅仅挂在jQuery对象下的静态方法(即$.map). 他们用法的异同:map()的返回值是包裹了一个Arr ...

  9. linux 添加 $path

    # vim /etc/profile在文档最后,添加:export PATH="/usr/local/src/bin:$PATH"保存,退出,然后运行:#source /etc/p ...

  10. Linux 在一个命令行上执行多个命令(转载)

    对于单个命令执行我想大多数人都是明了的,也就是在一个命令行上执行一条命令.那对于在一行上执行多个命令怎么办呢,其实也很简单,只需在各命令之间加上特殊命令符号,我们常规使用到的有3个特殊命令符号. 1. ...