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. Centos 5.5下安装samba

    1.安装: Centos 5.5下安装samba,具体步骤如下: [root@bogon ~]# rpm -q samba Package samba is not installed [root@b ...

  2. Swift中的延迟加载(懒加载)

    Swift方式的延迟加载 而在Swift中,你只需一行代码即可实现此机制: lazy var players = String[]() 简单.简洁,直入主题. 但你得记住,你必须使用var关键字来定义 ...

  3. 高放的python学习笔记之基本语法

    python与c++的不同之处 python的语句块不是用{}括起来的而是冒号后面跟一些与比当前语句多一的tab缩进的语句. 1.定义变量 python的变量类型不需要人为指出,会根据赋值的类型决定此 ...

  4. (原)C++中指针不初始化就传递的问题

    C++中指针的使用.以前在使用指针之前都会初始化.今天没有初始化,然后指针传递后没有内容(testptrnoret),后来发现返回指针的话(testptrret),就可以了. // testptr.c ...

  5. iBox v2.0 发布,Web化仿iOS7界面/交互的JavaScirpt库

    iBox2 是一个仿 iOS 7 界面/交互的 JavaScirpt 库,它运行在 webkit 内核的移动浏览器之上,依赖 iScroll5,帮助开发者构建更接近 iOS 体验的 WebApp. 伴 ...

  6. Apache Rewrite 拟静态配置54

    mod_rewrite 规则的使用 RewriteEngine on RewriteCond %{HTTP_HOST} !^www.php100.com  [NC]  RewriteRule   ^/ ...

  7. .NET MVC 插件化框架源码

    本来想把源码整理了放github上,但最近一直忙,就直接在这里放出来了,还写得不太完整,里面有几个例子,插件上传也没写,只写了插件zip包解压,如果大家在使用中有什么疑问,可以加QQ群:1429391 ...

  8. Ftp协议Socket实现

    原来用WebRequest来传输文件,被人鄙视了.就弄个Socket版的,支持Active,Passive模式. 带事件日志,有时间的人可以拿去做C#版的flashfxp. public class ...

  9. 转:内核空间与用户空间数据交换的方式之一 --ioctl(通过字符设备演示)

    对于linux而言,内核程序和用户程序分别运行在内核空间和用户空间,要实现两者的数据交换,主要有以下几种方式:系统调用,读写系统文件(procfs,sysfs, seq_file,debugfs等), ...

  10. ssh公钥自动登陆

    第一步,在服务器上安装ssh服务 sudo apt-get install ssh 通过ssh -v查看是否安装成功 第二步创建本地公钥秘钥对 ssh-keygen -t rsa  //创建ssh公钥 ...