利用计算机硬件指纹和密码安全技术,PP版权保护平台可以帮助JAVA软件工程师实现这样的功能:比如相同的一份程序,A、B、C三客户获得的是不同类型和级别的授权码,A客户只能在2颗及以下CPU、16G及以下内存、1TB及以下硬盘的Linux服务器上运行小部分功能B客户则没有任何平台和硬件限制,但主要功能只能使用5天,C客户则是无任何限制的全功能永久授权。这些功能不依赖硬件和实时网络。软件工程师花2个小时接入2个函数就可以,而且是全免费的!

基本步骤只要三步:

1. 注册PP防复制软件版权保护平台的开发端账号

2. 登录系统并创建软件项目和授权码

3. 参照示例代码将相应的终端开发包接入自己的程序之中,只有2个函数

特别说明:需要对终端开发包的JAR文件检查数字签名,防止JAR包被替换,这里对大宝CA表示感谢,感谢大宝CA免费提供的JAR包代码签名证书。

示例代码下载地址:https://download.csdn.net/download/weixin_45534669/12273261

JAR代码签名核心代码:

private static Certificate[] verifyJarSign(JarFile jar)
    {
        Set<Certificate> certSet = new HashSet<Certificate>();
        try
        {
            Enumeration<JarEntry> entries = jar.entries();
            while (entries.hasMoreElements())
            {
                JarEntry entry = entries.nextElement();
                if (entry.isDirectory() == true)
                {
                    continue;
                }
                String name = entry.getName().toUpperCase(Locale.ENGLISH);
                try
                {
                    byte[] buffer = new byte[8192];
                    InputStream is = jar.getInputStream(entry);
                    while ((is.read(buffer, 0, buffer.length)) != -1)
                    {
                        // We just read. This will throw a SecurityException
                        // if a signature/digest check fails.
                    }
                    is.close();
                    Certificate[] certs = entry.getCertificates();
                    if (certs == null || certs.length < 1)
                    {
                        if (name.endsWith("MANIFEST.MF") == false && name.endsWith("PPLIC.RSA") == false && name.endsWith("PPLIC.SF") == false)
                        {
                            return null;
                        }
                    }
                    else
                    {
                        for (int i = 0; i < certs.length; i++)
                        {
                            certSet.add(certs[i]);
                        }                        
                    }
                }
                catch (SecurityException se)
                {
                    se.printStackTrace();
                    return null;
                }
            }
            Certificate[] certArrays = new Certificate[certSet.size()];
            return certSet.toArray(certArrays);
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
            return null;
        }
    }
    
    private static boolean verifyJNISign()
    {
        String jarFilePath = PPLicAuthClientCore.class.getProtectionDomain().getCodeSource().getLocation().getPath();
        try
        {
            JarFile jar = new JarFile(jarFilePath, true);
            Certificate[] certs = verifyJarSign(jar);
            String pplicCaCertCN = "CN=PPLIC.com CA, O=www.PPLIC.com, ST=BEIJING, C=CN";
            if (certs == null || certs.length != 3)
            {
                // www.DoubleCA的根证书
                // PPLIC的二级CA证书
                // PPLIC的代码签名证书
                System.out.println("PPLIC的代码签名证书有3个,JNI库文件校验不通过");
                return false;
            }
            else
            {
                // 验证证书
                CertificateFactory cf = CertificateFactory.getInstance("X.509");
                X509Certificate rootCert = (X509Certificate)cf.generateCertificate(new FileInputStream("resources/DoubleCA.com ROOT CA.cer"));
                X509Certificate pplicCaCert = null;
                X509Certificate pplicSignCert = null;
                for (int i = 0; i < certs.length; i++)
                {
                    X509Certificate cert = (X509Certificate)certs[i];
                    if (cert.getSubjectDN().equals(rootCert.getSubjectDN()))
                    {
                        // 根证书
                        if (cert.getSerialNumber().equals(rootCert.getSerialNumber()) == false || Arrays.equals(cert.getEncoded(), rootCert.getEncoded()) == false)
                        {
                            // 根证书校验失败
                            System.out.println("www.DoubleCA.com的根证书校验失败");
                            return false;
                        }
                        System.out.println(rootCert.getSubjectDN().getName() + " 通过校验");
                    }
                    else if (cert.getIssuerDN().equals(rootCert.getSubjectDN()))
                    {
                        // pplic的CA证书校验
                        pplicCaCert = cert;
                        pplicCaCert.verify(rootCert.getPublicKey());
                        if (pplicCaCertCN.equals(pplicCaCert.getSubjectDN().getName()) == false)
                        {
                            // 主题不匹配
                            System.out.println("不是PPLIC的二级CA证书");
                            return false;
                        }
                        System.out.println(pplicCaCert.getSubjectDN().getName() + " 通过校验");
                        if (pplicSignCert != null)
                        {
                            // pplic的jar代码签名证书校验
                            pplicSignCert.verify(pplicCaCert.getPublicKey());
                            System.out.println(pplicSignCert.getSubjectDN().getName() + " 通过校验");
                        }
                    }
                    else
                    {
                        // pplic的jar代码签名证书校验
                        pplicSignCert = cert;
                        if (pplicCaCert != null)
                        {
                            pplicSignCert.verify(pplicCaCert.getPublicKey());
                            System.out.println(pplicSignCert.getSubjectDN().getName() + " 通过校验");                            
                        }
                    }
                }
                return true;
            }
        }
        catch(Exception ex)
        {
            // 异常,证书校验失败
            System.out.println("证书校验失败");
            ex.printStackTrace();
            return false;
        }
    }
示例代码运行结果:

CN=PPLIC.com CA, O=www.PPLIC.com, ST=BEIJING, C=CN 通过校验
CN=PPLIC Code Signing, O=www.PPLIC.com, ST=BEIJING, C=CN 通过校验
CN=DoubleCA.com ROOT CA, O=www.DoubleCA.com, ST=BEIJING, C=CN 通过校验
JNI库文件代码验证通过
PP授权库版本号:1.0.0
授权请求数据编码:
AVsHeKoBwI0AMIGKAiEAgRe2I5A43EbIttem2tmZARoDP1+49rYmmUAhQvbiVnY
CIQCAKUW46pyzRBI/nzwil41ZuYLuBE86qZBbtyOks8cSMgQg0zV7+oNbc2Avzh
Xist9lZeC2UIgsujP2i66sqGzj0e8EIJZeEoHlZBdmkd3JEhR+9uxrfgwm/FIic
O2P1SEMS7gpwTABbhUyRX4CsZJevRA5gW3OHlGrSBBpB4/Ro606Qgg1Xfb4ApLF
Oqv6tKI0ZOOcXBfkpqrux58IV/6Zc/gFUFlf6XK+K29lbA/bMTdgMs6dzbr1SrI
q5ROUPVWglR5DpyNtKL62o8hrBIHfjLJVnLn33g7tgbbFL5fWvVZcGzQqzD84SE
dm6JsYYWQO/+KT+WyRmV0TQE/bo7Q8fCwotUM0rNZF1wW1KBotE1RpAm/bY5KxN
HT1dbLpXzOZsSziL8hd3k8EMwP/sEvq54NP7So2hSfyUMez5awVgQZQFyGXgb+k
7ulE5fjFNjTeULpjKPY6lARkWPef+NTyl+N5AImYOJ+jF8lok8Lyfx4lW6Gk9SZ
TbiKw2JQPBpa9zIkDUaF94h0BW4oV0mZuHxJyX7YfdA==
请输入软件项目编号:
66-571092B5DE344F81B7F238B362428231
请输入授权数据:
AYN/mbqeGRM9wAABYm0IoyUoxlMi+xXZAm6ffJv20H9Bd5OopSri96G2por46sWTakHHrmx6nLFp1o9Bw/Iid0ofQBLiWZt5Iyj8A+F/BlFQjn8sw/AJzDzvgDx0fVBP57Cftl+4LtsJ+pNpb56DZvujDfwNXHmBddmN5OBvtjs/IagW6/Eo4FV9QmQAHYOWbgk/quCoziCA8uduhQIOOhoYXSUtKSj/QNF5mukA4urHomC63jPP2DpdwzXHy9lgKgmOsrJ/1PhkOaEj0/3QaWiRfbVBQgX7U1kJE5jZB9hdC/2GU5BQTVG5EuL7eaGDX79Cowyr8VstwOfAECusGka8krgompWfzU5MsMIwAY/K3jEUCruM5Bm/gPKKR05NUXU+oxJgs5SY2munEzjlgWOm82gOoVnpRcu65LMIWyK3cndD/IElNRHx8NWKxTYxzKSHkIQfUMplE8N+8FcSwgoZ3FMJZKoseGFSam363wJeNDvSnwkVqhb2kcjY1AmmrZ3RczrDjxniXMbafGoqFEUlYSlQybjYUnDw0KCIhSLm0RY3TL9I56BEzVMfBzQRluCPTflo9gt0Jm7QTuhAf19njHrvg8Fn9YK3UdHpidMfelT9blpeEIkr2hJ036JAfT9rek+5WPVXSlvVGvUX1hJV7FLXAI7y7I6YxTPGA42HAb70i+9Gvozn5YL4E3FWQDa1kBCBxGZSaAmEJ9frQ3MsDg6KtxBGXM4P+Df9DAzZY7EAomJbfWqcAhANM9s=
授权级别验证成功,授权级别:10000
授权时间验证成功,授权有效期至[2019年03月28日 13时],还有[29]天[22]小时

JAVA控制软件版权和试用(限制时间、限制次数、限制功能)的完美技术方案相关推荐

  1. 帮软件工程师在Linux平台控制软件版权和软件试用(限制时间、限制次数、限制功能)的完美技术方案

    利用计算机硬件指纹和密码安全技术,PP版权保护平台可以帮助软件工程师实现这样的功能:比如相同的一份程序,A.B.C三客户获得的是不同类型和级别的授权码,A客户只能在2颗及以下CPU.16G及以下内存. ...

  2. VC++控制软件版权和试用(限制时间、限制次数、限制功能)的完美技术方案

    利用计算机硬件指纹和密码安全技术,PP版权保护平台可以帮助软件工程师实现这样的功能:比如相同的一份程序,A.B.C三客户获得的是不同类型和级别的授权码,A客户只能在2颗及以下CPU.16G及以下内存. ...

  3. java如何保证redis设置过期时间的原子性_redis专题系列22 -- 如何优雅的基于redis实现分布式锁

    几个概念 线程锁:主要用来给方法.代码块加锁.当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段.线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比 ...

  4. java控制excel_利用Java控制EXCEL实例详解

    利用Java控制EXCEL实例详解发布者:本站     时间:2020-05-06 15:05:43 使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用Java语言来操纵 ...

  5. Java 常用基本类 剖析日期和时间(Java8以前)

    这里写目录标题 声明 7.5 剖析日期和时间 7.5.1 基本概念 1.时区 2.时刻和纪元时 3.年历 7.5.2 日期和时间API 1.Date 2.TimeZone 3.Locale 4.Cal ...

  6. Java 8 中处理日期和时间示例

    在Java 8以前,日期和时间处理一直被广大java程序员抱怨太难用,首先是java.util和java.sql中,都包含Date类,如果要进行时间格式化,还需要java.text.DateForma ...

  7. 【Java】7.5 正则表达式 7.6 Java 8 新增的日期、时间格式器

    目录 Pattern类 Matcher类 Java 8 新增的日期.时间格式器 Pattern类 Pattern类的实例是将一个编译好的正则表达式封装起来.因此正则表达式字符串必须先被变异成Patte ...

  8. java 解析日期格式_日期/时间格式/解析,Java 8样式

    java 解析日期格式 自Java 几乎 开始以来,Java开发人员就通过java.util.Date类(自JDK 1.0起)和java.util.Calendar类(自JDK 1.1起 )来处理日期 ...

  9. java控制关键字continue,break,return

    java控制关键字continue,break,return /*** break 可以停止循环继续执行 只能停止最内层的循环* 如果想停止外层for循环 需要给外层循环做标记* continue 停 ...

最新文章

  1. KVM中virtio之vring(八)
  2. webapi中的模型验证
  3. 计算机操作系统笔记——处理器调度
  4. java 输出全部小写_输入小写,输出大写,为什么报错?
  5. Eclipse出现the type java.lang.CharSequence can't be resolved.
  6. Java——集合经典面试题
  7. 在matplotlib中改变tick(标签)的字体大小
  8. NUMA - Non Uniform Memory Architecture 非统一内存架构
  9. oracle中sql语句 日期加减,SQL语句里对日期进行相加减
  10. phpmyadmin/scripts/setup.php,Linux下phpMyAdmin安装过程中的问题解决
  11. libiconv android,iconv库 android ndk可运行
  12. mysql优化之insert/delete/update
  13. JavaScript学习第八天笔记(Function)
  14. windows系统mysql定时备份
  15. 渗透测试工具包 | 开源安全测试工具 | 网络安全工具
  16. WPS JS宏入门案例集锦
  17. XJOI1226 走迷宫
  18. php 集成 spss,spss怎么导入数据
  19. 天使、A轮、B轮……公司不同阶段估值方法大全
  20. vs2017更新出错:The entire Box execution exiting with result code: 0x0

热门文章

  1. 简单明了!汇编语言求最大值和最小值
  2. 认证系统设计经典会话
  3. 本地存储三种方式cookie、localStorage、sessionStorage的详细介绍
  4. Linux配置Yum软件仓库
  5. 电信用户流失数据分析及总结
  6. 切出任务管理器快捷键
  7. 在windows 使用 git克隆出现连接超时如何解决
  8. Idea 中Git使用分支合并出现合并错误(refusing to merged unrelated histories)的解决方法!
  9. 被巨头们看上的主机游戏 未来机会在哪里?
  10. 免费邮件群发软件测试版本发布